站点图标 WordPress智库

使用文章复制插件快速创建Polylang管理的另一个语言的文章

使用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);
    }
}

把上面的函数用在第一段代码中合适的位置,就可以在复制后为新语言的文章设置对应的分类方法了。

以上代码实现的只是两个语言的自动设置,如果您的网站是多个语言,代码会复杂不少,有可能还需要修改文章复制插件才能实现。有这种需要的朋友可以参考上面的代码试着实现一下。

退出移动版