阅读提示
本文约 1,069 字,预计阅读 3 分钟。文中命令与配置均经过实测,可直接参考执行。
本文约 1,069 字,预计阅读 3 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:搜”手机”却蹦出英文 keyword
默认 WordPress 搜索不区分语言,用户输入中文词可能返回英文文章,自动补全(autosuggest)也常跨语言乱推。对多语言站,搜索体验本地化是留存关键。
原理分析:默认搜索为何跨语言
WordPress 原生 WP_Query 的 s 参数只做全文匹配,不读语言信息。WPML 通过 wpml_object_language 钩子在查询时追加语言条件,但原生 autosuggest(如主题自带搜索框)通常不调用该钩子,导致建议词跨语言。解决思路是换用支持多语言的搜索插件,或在查询处强制注入语言过滤。
保姆级实操
- SearchWP:装后建”引擎”,在 WPML 下每个语言自动建独立索引,搜索框建议仅返回当前语言结果。
- ElasticPress:接 Elasticsearch,索引时打
lang字段,前端查询带filter['lang']=当前语言。 - 代码拦截:用
pre_get_posts钩子给搜索查询加wpml_object_language过滤:
add_action('pre_get_posts', function($q){
if($q->is_search() && !is_admin()){
$q->set('lang', ICL_LANGUAGE_CODE);
}
});
- 前端补全:用 WPREST API
search端点加lang参数返回 JSON 供 autocomplete 调用。 - 禁用跨语言:在
functions.php中add_filter('wpml_disable_term_search', '__return_true');限制术语跨语言。
常见踩坑
- 案例:某站用主题自带 ajax 搜索,未接 WPML 钩子,法文用户搜”livraison”返回英文 shipping 文章,体验崩坏。
- SearchWP 未重新建索引,改语言后仍用旧索引。
- ElasticPress 字段名写错为
language而非lang,过滤失效。 - autocomplete 返回草稿译文,需加
post_status='publish'条件。
总结
分语言搜索建议靠”索引分层 + 查询注入语言”。优先 SearchWP/ElasticPress,预算紧就用 pre_get_posts 钩子。搜索质量也会影响 多语言站点Google索引监控,相关结果越多收录越健康。
觉得有用?点个赞支持一下
标签:
# ElasticPress
# ElasticPress 多语言
# SearchWP
# SearchWP 多语言
# WordPress 分语言搜索
# WPML 搜索过滤
# WPML搜索
# 分语言搜索
# 多语言 autosuggest
# 多语言站点搜索建议
# 自动补全
