使用add_rewrite_rule后get_query_var无法获取变量值的问题
WordPress URL重写与query_var获取问题修复
以下是你当前代码存在的问题及修复方案:
1. 错误:flush_rewrite_rules() 滥用
不要在init钩子中每次加载都调用flush_rewrite_rules(),这会严重拖慢网站性能。仅在主题/插件激活时执行一次,或者手动在WordPress后台「设置→固定链接」页面点击「保存更改」来刷新规则即可。
2. 重写规则的匹配逻辑问题
你当前的规则硬编码了fr,且正则匹配范围有限,同时目标URL中的&需要替换为&(PHP字符串中无需转义)。修正后的规则应将语言前缀作为动态变量捕获,而非固定值:
function custom_rewrite_rules() { add_rewrite_rule( '^([a-z]{2})/([a-z0-9-]+)/?$', // 匹配2位语言前缀+页面slug,兼容结尾斜杠 'index.php?pagename=$matches[2]&myvariable=$matches[1]', 'top' ); } add_action('init', 'custom_rewrite_rules');
3. query_vars 过滤函数优化
你的query_vars函数本身无错误,但可添加去重逻辑避免重复注册:
function add_custom_query_vars($vars) { if (!in_array('myvariable', $vars)) { $vars[] = 'myvariable'; } return $vars; } add_filter('query_vars', 'add_custom_query_vars');
4. 正确获取query_var的时机
确保在WordPress初始化完成后调用get_query_var('myvariable'),比如在模板文件中,或者template_redirect钩子之后:
// 示例:在模板中获取变量 $lang = get_query_var('myvariable'); if (!empty($lang)) { echo '当前语言标识:' . $lang; } // 或者通过钩子处理 function handle_language_var() { $lang = get_query_var('myvariable'); // 这里添加你的业务逻辑 } add_action('template_redirect', 'handle_language_var');
最后一步:刷新重写规则
完成代码修改后,登录WordPress后台进入「设置→固定链接」,无需修改任何设置,直接点击「保存更改」触发规则刷新,新规则即可生效。
内容的提问来源于stack exchange,提问作者patrice pellier
相关产品推荐
相关产品推荐

