使用Polylang建设多语言网站的时候,一个文章的两个语言版本之间,除了语言不同,其他方面其实都是相同的,如果把这些相同的部分再输入或设置一遍,效率是非常低的,特别是一个文章的自定义字段特别多的时候。
当两个语言的文章中有大量的自定义字段需要发布的时候,我们会为客户安装一个文章复制插件,来避免把相同的自定义字段再输入一次。但是这种方便无法自动建立两种语言版本之间的关联,需要在编辑文章的时候,在 Polylang 中手动关联一下。而手动关联这个操作比较麻烦。我们想帮客户找到一种尽量减少麻烦的办法。
在复制文章的时间自动建立Polylang语言关联
复制文章我们使用的Post Duplicator插件,在研究了这个插件的代码之后,我们发现了mtphr_post_duplicator_created hook,该Hook可以让我们在复制文章之后,对复制的文章进行更多操作。结合 Polylang 的一些函数,我们使用以下代码实现了复制后,自动建立两个语言版本关联的操作。
下面代码中,zh 是 Polylang 简体中文的别名,de 是德语的别名。在用户点击复制复制文章后,代码会获取当前文章的语言,然后判断并设置复制后新文章的语言。最后设置两个语言之间的关联关系。
/**
* 复制文章时创建文章关系
*/
add_action('mtphr_post_duplicator_created', function ($original_id, $duplicate_id)
{
$original_id = absint($original_id);
$original_lang = pll_get_post_language($original_id, 'slug');
$new_lang = ($original_lang == 'de') ? 'zh' : 'de';
pll_set_post_language($duplicate_id, $new_lang);
pll_save_post_translations([
$original_lang => $original_id,
$new_lang => $duplicate_id,
]);
}, 10, 2);
复制文章后,设置对应语言的自定义分类方法
通过上面的代码,我们实现了文章内容和自定义字段的复制。但是文章的自定义分类方法并没有复制过来。这是因为源语言的分类法项目在新的语言环境下不存在,存在的只是翻译后的新语言的分类法项目。
和文章一样,源语言和新语言的分类法项目是可以关联起来的。我们可以使用Polylang 函数 pll_get_term() 来获取新语言对应的分类法项目,然后和复制后的新文章关联起来。这样就实现了分类法项目的复制。具体代码如下。
/**
* 复制后,设置新语言的分类方法
*
* @param $original_id 原始文章 ID
* @param $duplicate_id 复制后的文章 ID
* @param $taxonomy 分类法名称
* @param $new_lang 新语言别名
*/
function polylang_set_new_terms($original_id, $duplicate_id, $taxonomy, $new_lang)
{
$terms = wp_get_post_terms($original_id, $taxonomy);
foreach ($terms as $term) {
$new_lang_term_id = pll_get_term($term->term_id, $new_lang);
wp_set_post_terms($duplicate_id, $new_lang_term_id, $taxonomy);
}
}
把上面的函数用在第一段代码中合适的位置,就可以在复制后为新语言的文章设置对应的分类方法了。
以上代码实现的只是两个语言的自动设置,如果您的网站是多个语言,代码会复杂不少,有可能还需要修改文章复制插件才能实现。有这种需要的朋友可以参考上面的代码试着实现一下。
2 thoughts on “使用文章复制插件 Post Duplicator 快速复制Polylang 文章到其他语言”
学习一招。
第一次知道文章复制插件