WordPress add_rewrite_rule正则匹配及路由重写问题求助
问题解答
(1) 参数命名问题
同含义参数不需要强制设置不同的占位符名称,只要对应规则的逻辑能区分开即可。如果三类场景下的产品分类参数后续处理逻辑一致,完全可以统一命名,只需在query_vars过滤器中注册一次即可,不会影响功能。
(2) rangeofproduct参数无法写入的原因
主要有三个问题:
- 第二条规则的正则本身存在多处错误:一是前缀写的是
product,和你要匹配的products路径前缀不符;二是正则内多了多余的]符号;三是add_rewrite_rule的第三个参数top'缺失左侧单引号,存在语法错误。 - WordPress的
add_rewrite_rule默认仅匹配URL的路径部分,不会匹配?后的查询参数,你把code=写在正则里本身就无法命中目标链接。 - 规则顺序错误,更宽松的第一条规则先命中了目标链接,第二条规则根本没有触发机会,自然不会生成
rangeofproduct参数。
(3) $matches计数规则
每个独立的重写规则的$matches数组是单独计数的,捕获组序号从当前规则的第一个括号开始计算,不需要按规则的全局顺序累加,三个规则都可以单独使用$matches[1]指代自身的第一个捕获组。
(4) 第一条规则正则修改方案
将原正则中的贪婪匹配任意字符的.+替换为排除斜杠的匹配规则[^/]+即可,[^/]表示匹配除了路径分隔符/之外的所有字符,不会匹配到包含中间斜杠的二级路径。
修改后的第一条重写规则为:
add_rewrite_rule('products/([^/]+)/?$', 'index.php?range=$matches[1]', 'top');
额外优化建议
为了让所有规则正常触发,建议你调整规则的排序:将匹配路径最长、规则最严格的第三条规则放在最前面,然后放第二条规则(注意修正正则错误,不要在重写规则里匹配查询参数,code直接通过全局参数获取即可),最后放最宽松的一级分类匹配规则,避免短规则提前命中长路径。
内容的提问来源于stack exchange,提问作者Igor Beuermann
相关产品推荐
相关产品推荐

