×

Polylang禁用特色图片同步

2023-07-29 12:31:45 Falcon

设想的情况应该是两种语言版本,分别使用不同的特色图片,然而实际上表现为修改了一种语言的文章下的特色图片,另一种语言版本的文章特色图片也同步更新了。

原因可能是启用了Polylang设置下位于 http://example.com/wp-admin/admin.php?page=mlang_settings

的 Synchronization 扩展,并勾选了Featured image 。

方法一:移除这个勾选 

然而我移除并保存后修改发现并没有生效,修改一种语言下的文章的特色图片,另一种语言下文章的特色图片仍然会同步修改。(不过我最后试验又可以了。。。很诡异,可能有缓存还是什么)

 

方法二:使用代码修改

// 禁用 Polylang 特色图片同步
add_filter('pll_copy_post_metas', 'disable_polylang_featured_image_sync', 10, 3);
function disable_polylang_featured_image_sync($metas, $sync, $from_post_id) {
    // 移除特定元素 '_thumbnail_id'
    $metas = array_diff($metas, array('_thumbnail_id'));
    return $metas;
}

可以生效,另外 array_diff 是个很不错的函数,如果用 foreach 和unset就很啰嗦。当然我是从chatgpt学到的。

//foreach和unset的版本
foreach($metas as $k=>$meta_value){
        if($meta_value == '_thumbnail_id'){
            unset($metas[$k]);
        }
 }
 return $metas;

作用是这样的:

array_diff() 函数可以返回两个数组的差异部分,这样我们就能排除掉 _thumbnail_id 元素。

在上述代码中,我们使用了 array_diff() 函数来移除 $metas 数组中的 _thumbnail_id 元素,然后将处理后的数组返回。这样可以更简洁地实现相同的功能。

 

我还问了它一个问题,看看会不会出现意外的情况

如果$metas值中没有 _thumbnail_id 结果会怎么样?

它说:

如果 $metas 数组中没有 _thumbnail_id 这个元素,那么在使用 array_diff() 函数时不会有任何变化,$metas 数组将保持原样。这不会导致错误或异常,只是简单地返回未经修改的 $metas 数组。

array_diff() 函数的工作原理是将第一个数组中存在而其他数组中不存在的元素返回为结果。如果 $metas 数组中没有 _thumbnail_id 元素,那么 array_diff($metas, array('_thumbnail_id')) 的结果将与 $metas 数组相同。

因此,无论 $metas 数组中是否有 _thumbnail_id 元素,代码都可以正常运行。如果 $metas 中有 _thumbnail_id 元素,则会被移除;如果没有,则原样返回。这样的代码设计通常是为了确保在不同情况下代码能够正确处理并不会导致意外错误。

方法三:使用 wpml-config.xml

这个方法来自这个问答

wp-content/wpml-config.xml 写入以下内容:

<wpml-config>
  <custom-fields>
    <custom-field action="translate">_thumbnail_id</custom-field>
  </custom-fields>
</wpml-config>

关于polylang中的wpml-config.xml,可以查看官方说明 , 主要是为了兼容wpml的设计。

但经我测试这个不生效。。。

本文收录于