如何通过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']; } }
关键调整点
- 先保证默认语言术语存在:所有翻译版本都基于默认语言的术语创建,这是WPML多语言内容的核心逻辑。
- 用WPML官方方式检查翻译:通过
wpml_object_id过滤器查询目标语言是否已有对应翻译,避免重复创建。 - 手动关联翻译关系:创建新术语后,通过
wpml_set_element_language_details动作告诉WPML这个术语是默认语言术语的翻译,这样WPML会在后台正确标记语言属性,后续查询时就能返回对应的独立term_id。 - 分类可翻译设置:确保你的
house-collection分类在WPML的「分类/标签翻译」设置中被标记为可翻译。
内容的提问来源于stack exchange,提问作者sfarzoso
相关产品推荐
相关产品推荐

