WordPress多语言主题:如何通过Rewrite规则适配页面与文章等内容类型
解决方案
要实现带语言前缀的URL(如https://example.com/en/blog)能匹配对应页面、文章及自定义内容类型,需调整重写规则并配合查询调整,具体步骤如下:
1. 注册语言查询变量
首先确保WordPress能识别language参数,避免被过滤掉:
add_filter('query_vars', function($vars) { $vars[] = 'language'; return $vars; });
2. 添加重写规则
定义支持的语言代码,编写匹配语言前缀的重写规则,同时覆盖首页和带内容路径的场景:
// 替换为你实际支持的语言代码 $supported_languages = ['en', 'zh-CN', 'fr']; $language_regex = implode('|', array_map('preg_quote', $supported_languages)); // 匹配带内容路径的URL(如/en/blog) add_rewrite_rule( "^($language_regex)/(.*)$", 'index.php?name=$matches[2]&language=$matches[1]', 'top' ); // 匹配语言前缀首页(如/en/) add_rewrite_rule( "^($language_regex)/?$", 'index.php?language=$matches[1]', 'top' );
3. 调整主查询匹配所有内容类型
默认情况下,name参数只会匹配文章(post类型),需通过pre_get_posts动作让查询同时匹配页面、自定义内容类型:
add_action('pre_get_posts', function($query) { // 仅处理前台主查询,且存在language参数时生效 if (!is_admin() && $query->is_main_query() && get_query_var('language')) { // 设置查询匹配所有内容类型 $query->set('post_type', 'any'); // 这里可保留你已实现的语言本地化逻辑 } });
4. 刷新重写规则
完成代码添加后,进入WordPress后台的设置 → 固定链接页面,直接点击「保存更改」(无需修改任何设置),触发重写规则刷新,确保新规则生效。
原理说明
- 重写规则捕获语言前缀和后续路径,将路径部分通过
name参数传递给WordPress查询 pre_get_posts中设置post_type=any,让WordPress自动匹配文章、页面或自定义内容类型的slug- 保留
language参数供你已实现的本地化逻辑使用
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

