使用WPML翻译分类术语后,如何获取正确的自定义分类链接?
解决WPML多语言下自定义分类术语链接错误的问题
WPML会为每种语言创建独立的术语条目,直接用原生get_term_link()调用默认语言的术语ID,自然只会返回默认语言的链接。要获取当前语言对应的正确链接,你需要借助WPML提供的专属过滤器先拿到翻译后的术语对象,再生成链接。
下面是两种实用的解决方案:
方案一:转换已有术语ID到当前语言
如果你已经持有默认语言的术语对象(比如你的代码中的$category),可以通过wpml_object_id过滤器获取当前语言对应的术语ID,再生成链接:
// 获取当前语言下的翻译术语ID $translated_term_id = apply_filters( 'wpml_object_id', $category->term_id, 'galerija-taxonomy', true ); // 获取翻译后的完整术语对象 $translated_term = get_term( $translated_term_id, 'galerija-taxonomy' ); // 生成并输出安全的链接 if ( $translated_term && ! is_wp_error( $translated_term ) ) { $term_link = get_term_link( $translated_term ); echo '<a href="' . esc_url( $term_link ) . '">' . esc_html( $translated_term->name ) . '</a>'; }
参数说明:
wpml_object_id的第三个参数true表示:如果当前语言没有该术语的翻译,就返回原术语ID(如果希望没有翻译时不显示内容,可以改成false);- 务必使用
esc_url()和esc_html()做安全处理,避免XSS漏洞。
方案二:直接获取当前语言的术语列表
如果需要遍历术语列表,直接用WPML的wpml_object_filter过滤器过滤get_terms()的结果,确保拿到的是当前语言的术语集合:
// 获取当前语言下的所有自定义分类术语 $terms = apply_filters( 'wpml_object_filter', get_terms( array( 'taxonomy' => 'galerija-taxonomy', 'hide_empty' => false, // 根据业务需求调整是否隐藏空术语 ) ), 'galerija-taxonomy' ); // 遍历输出每个术语的链接 foreach ( $terms as $term ) { $term_link = get_term_link( $term ); if ( ! is_wp_error( $term_link ) ) { echo '<a href="' . esc_url( $term_link ) . '">' . esc_html( $term->name ) . '</a>'; } }
额外技巧:获取特定语言的术语链接
如果需要获取非当前语言的术语链接(比如强制获取法语版本的链接),可以在wpml_object_id里添加第四个参数指定目标语言代码:
// 获取法语翻译的术语ID $translated_term_id = apply_filters( 'wpml_object_id', $category->term_id, 'galerija-taxonomy', true, 'fr' );
关键注意事项:
- 确保你已经在WPML后台完成了该自定义分类术语的翻译配置,每个术语都有对应语言的翻译条目;
- 测试时切换不同语言,验证链接是否正确跳转到对应语言的术语归档页面。
内容的提问来源于stack exchange,提问作者Ivan Topić
相关产品推荐
相关产品推荐

