如何让WordPress重写规则匹配含查询参数的URL并保留参数?
解决WordPress重写规则无法匹配带查询参数URL的问题
问题原因
Apache的mod_rewrite在匹配规则时,只会检查URL的路径部分(即?之前的内容),你的原规则本身可以匹配带查询参数的请求,但可能因为未刷新重写规则、或者需要明确强制追加查询参数导致问题。
解决方案
方案1:确保重写规则生效并利用默认的查询参数保留机制
你的原规则本身是正确的,只需确保WordPress加载了最新的重写规则:
- 保留原有的代码:
add_rewrite_tag('%c%', '([^&]+)'); add_rewrite_rule('^blog/([a-z0-9-]+)[/]?', 'index.php?pagename=blog&c=$matches[1]', 'top');
- 登录WordPress后台,进入设置 > 固定链接
- 无需修改任何设置,直接点击「保存更改」按钮,触发重写规则刷新
此时,当访问https://example.com/blog/category?utm_campaign=web时,WordPress会自动将原查询参数追加到目标URL中,最终请求的是index.php?pagename=blog&c=category&utm_campaign=web
方案2:强制添加QSA标志(确保查询参数被追加)
如果方案1无效,可以通过钩子添加带有QSA(Query String Append)标志的规则,强制Apache保留原查询参数:
add_rewrite_tag('%c%', '([^&]+)'); function add_custom_rewrite_with_qsa() { global $wp_rewrite; // 将自定义规则放在规则列表最顶部,确保优先匹配 $wp_rewrite->rules = array( '^blog/([a-z0-9-]+)[/]?$' => $wp_rewrite->index . '?pagename=blog&c=$matches[1] [QSA,L]' ) + $wp_rewrite->rules; } add_action('generate_rewrite_rules', 'add_custom_rewrite_with_qsa');
同样,添加代码后需要进入后台固定链接页面保存更改,刷新规则。
验证方法
访问带查询参数的URL后,可以通过以下方式验证参数是否被保留:
- 在你的
blog页面模板中添加代码:
var_dump($_GET);
- 访问
https://example.com/blog/category?utm_campaign=web,查看输出是否包含c=category和utm_campaign=web两个参数。
内容的提问来源于stack exchange,提问作者Ibrahim Azhar Armar
相关产品推荐
相关产品推荐

