如何在WordPress+Polylang环境中移除URL中的/category/
解决Polylang多语言站点移除URL中/category/的问题
要解决这个问题,你需要同时处理分类链接的生成逻辑和WordPress的重写规则——Polylang的多语言前缀会让原代码的替换逻辑失效,具体操作如下:
- 替换原有的
category_link过滤器代码,改成适配多语言前缀的版本:
add_filter('category_link', function($link) { // 不管链接里有没有语言前缀,都移除/category/ return str_replace('/category/', '/', $link); }, 99);
原代码只替换了category/,但多语言链接结构是/de/category/,所以要替换带前置斜杠的/category/,确保所有语言版本的分类链接都能正确去掉冗余路径。
- 添加重写规则,让WordPress识别去掉category的多语言分类URL:
add_filter('rewrite_rules_array', function($rules) { $new_rules = array(); // 匹配带两位语言码的分类URL(比如/de/blog/) $new_rules['^([a-z]{2})/([^/]+)/?$'] = 'index.php?lang=$matches[1]&category_name=$matches[2]'; // 匹配主语言的分类URL(比如/blog/) $new_rules['^([^/]+)/?$'] = 'index.php?category_name=$matches[1]'; // 把新规则放到最前面,确保优先匹配 return $new_rules + $rules; });
这段规则会捕获带语言前缀的URL,将其映射到对应语言的分类页面,同时兼容主语言的URL结构。
- 最后必须刷新固定链接设置:
进入WordPress后台 → 设置 → 固定链接,无需修改任何选项,直接点击「保存更改」,让WordPress更新重写规则。
完成以上操作后,site.com/blog/和site.com/de/blog/都能正常返回200状态码,访问对应的分类页面。
内容的提问来源于stack exchange,提问作者Ricardo Desouza
相关产品推荐
相关产品推荐

