You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WPML以编程方式插入相同slug的WordPress术语?

问题解决思路与代码修改

问题原因

你直接切换语言后用wp_insert_term创建术语的方式,WPML并不会自动把它识别为默认语言术语的翻译版本。反而因为WPML的内部语言过滤机制,可能会返回默认语言术语的ID,导致你误以为翻译版本和原术语共享同一个ID。

修改后的代码

protected function insert_update_taxonomy($family_name, $post_id, $lang)
{
    $default_lang = $this->sitepress->get_default_language();
    $taxonomy = 'house-collection';

    // 先处理默认语言的术语:获取或创建
    $this->sitepress->switch_lang($default_lang);
    $default_term_id = $this->is_taxonomy_exists($family_name, $taxonomy);

    $collection_id = $default_term_id;
    if ($lang !== $default_lang) {
        // 切换到目标语言,检查该术语是否已有对应翻译
        $this->sitepress->switch_lang($lang);
        $translated_term_id = apply_filters('wpml_object_id', $default_term_id, $taxonomy, true, $lang);
        
        if (!$translated_term_id) {
            // 没有翻译的话,创建新术语并关联为翻译版本
            $result = wp_insert_term($family_name, $taxonomy);
            if (!is_wp_error($result)) {
                $translated_term_id = $result['term_id'];
                // 告诉WPML这个新术语是默认语言术语的翻译
                do_action('wpml_set_element_language_details', [
                    'element_id' => $translated_term_id,
                    'element_type' => $taxonomy,
                    'language_code' => $lang,
                    'source_language_code' => $default_lang
                ]);
            }
        }
        $collection_id = $translated_term_id;
    }

    // 将术语关联到文章,确保Term和Post的语言匹配
    wp_set_object_terms($post_id, $collection_id, $taxonomy);

    // 切回默认语言
    $this->sitepress->switch_lang($default_lang);

    return $collection_id;
}

private function is_taxonomy_exists($family_name, $taxonomy)
{
    $slug = sanitize_title($family_name);
    $args = array(
        'taxonomy'          => $taxonomy,
        'slug'              => $slug,
        'suppress_filters'  => false,
        'lang'              => $this->sitepress->get_current_language(),
    );
    $terms = get_terms($args);

    if (!empty($terms) && !is_wp_error($terms)) {
        return $terms[0]->term_id;
    } else {
        $result = wp_insert_term($family_name, $taxonomy);
        return is_wp_error($result) ? 0 : $result['term_id'];
    }
}

关键调整点

  1. 先保证默认语言术语存在:所有翻译版本都基于默认语言的术语创建,这是WPML多语言内容的核心逻辑。
  2. 用WPML官方方式检查翻译:通过wpml_object_id过滤器查询目标语言是否已有对应翻译,避免重复创建。
  3. 手动关联翻译关系:创建新术语后,通过wpml_set_element_language_details动作告诉WPML这个术语是默认语言术语的翻译,这样WPML会在后台正确标记语言属性,后续查询时就能返回对应的独立term_id。
  4. 分类可翻译设置:确保你的house-collection分类在WPML的「分类/标签翻译」设置中被标记为可翻译。

内容的提问来源于stack exchange,提问作者sfarzoso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:42:13