如何在WordPress的Polylang插件中为特定页面隐藏URL中的语言代码
解决Polylang特定页面移除URL语言代码的问题
嘿,这个需求我之前帮好几个做多语言站的朋友解决过,用Polylang的话完全可以通过两个钩子函数来实现,不用装额外插件,直接在主题的functions.php里加代码就行,分两步走:
1. 修改页面链接生成逻辑,让特定页面不带语言代码
Polylang有个pll_get_post_language_link钩子,专门用来控制文章/页面的多语言链接生成。我们可以在这里过滤,当遇到目标页面时,移除URL里的语言代码:
add_filter('pll_get_post_language_link', 'remove_lang_code_from_specific_pages', 10, 3); function remove_lang_code_from_specific_pages($url, $post_id, $lang) { // 定义需要移除语言代码的页面slug(把这里替换成你的目标页面slug,多个的话用逗号分隔) $target_pages = ['page_slug']; $post = get_post($post_id); // 检查当前页面是否在目标列表中,并且不是默认语言(如果默认语言本来就不带代码的话) if (in_array($post->post_name, $target_pages) && $lang !== pll_default_language()) { // 移除URL中的语言代码部分 $url = str_replace('/' . $lang . '/', '/', $url); } return $url; }
如果你习惯用页面ID来判断(比slug更稳定,避免修改slug后失效),可以把判断条件改成:
if (in_array($post->ID, [123, 456]) && $lang !== pll_default_language()) {
2. 处理无语言代码的URL请求,确保能正确加载对应页面
第一步只是让链接生成不带语言代码,但用户访问这个链接时,Polylang可能会默认加载默认语言的页面,所以我们需要再加一个钩子来处理请求,告诉WordPress加载指定语言的目标页面:
add_action('parse_request', 'handle_langless_specific_page_requests'); function handle_langless_specific_page_requests($wp) { // 同样定义目标页面的slug $target_pages = ['page_slug']; $requested_slug = $wp->request; // 检查请求的是目标页面,并且当前没有设置语言(避免和默认语言的URL冲突) if (in_array($requested_slug, $target_pages) && !pll_current_language()) { // 切换到你想要的语言(比如例子中的'nl',替换成你的目标语言代码) pll_switch_language('nl'); // 告诉WordPress加载对应的页面 $wp->query_vars['pagename'] = $requested_slug; } }
关键注意事项
- 记得把代码里的
page_slug、123,456、nl这些值替换成你实际的页面信息和语言代码 - 如果你的Polylang设置里勾选了所有语言都显示语言代码(包括默认语言),那要去掉第一个函数里的
$lang !== pll_default_language()判断条件 - 修改完代码后,一定要去WordPress后台的「设置→固定链接」页面,直接点击「保存更改」,刷新固定链接规则,否则新的URL可能不生效
- 测试前清一下浏览器缓存和网站的缓存插件缓存,避免旧URL的缓存影响测试结果
内容的提问来源于stack exchange,提问作者Hims V
相关产品推荐
相关产品推荐

