You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:55:58