WordPress多项目对比页URL重写规则实现方案咨询
方案结论
这个需求完全可以通过WordPress官方add_rewrite_rule函数实现,不推荐直接修改.htaccess:WordPress每次保存固定链接、切换主题、启停插件时都会自动重写.htaccess内容,手动添加的规则很容易被覆盖,用官方API的方案维护成本低、兼容性更好。
官方API实现步骤
把下面代码加到当前主题的functions.php文件,或者自定义功能插件里即可:
// 注册自定义查询变量,让WordPress识别items参数 add_filter('query_vars', function($vars) { $vars[] = 'items'; return $vars; }); // 添加重写规则,支持2-4个对比项的语义化路径 add_action('init', function() { add_rewrite_rule( // 正则规则:匹配/compare/开头,1-4组用-vs-分隔的字符段,结尾支持可选斜杠 '^compare/([a-zA-Z0-9\-_]+)(?:-vs-([a-zA-Z0-9\-_]+))?(?:-vs-([a-zA-Z0-9\-_]+))?(?:-vs-([a-zA-Z0-9\-_]+))?/?$', // 映射到WordPress内部查询,这里pagename=compare对应你原/compare/页面的固定别名 'index.php?pagename=compare&items=$matches[1]-vs-$matches[2]-vs-$matches[3]-vs-$matches[4]', 'top' ); }); // 把路径里-vs-分隔的内容转换为原逻辑需要的逗号分隔格式 add_action('parse_request', function($wp) { if (isset($wp->query_vars['items'])) { $item_arr = explode('-vs-', $wp->query_vars['items']); $item_arr = array_filter($item_arr); // 过滤正则匹配产生的空值 $wp->query_vars['items'] = implode(',', $item_arr); } }); // 主题激活时自动刷新重写规则 add_action('after_switch_theme', function() { flush_rewrite_rules(); });
配置生效操作
代码添加完成后,进WordPress后台「设置-固定链接」页面,不用修改任何配置,直接点击底部「保存更改」按钮,重写规则就会生效。
适配调整说明
- 如果你的对比项slug包含中文、其他特殊字符,可以自行修改正则里的
[a-zA-Z0-9\-_]匹配范围 - 如果/compare/不是固定别名为compare的普通页面,把规则里的
pagename=compare替换成对应页面/路由的查询参数即可,比如自定义文章类型要改成对应post_type的参数。
.htaccess实现方式(非必要不推荐)
如果因为特殊场景必须用.htaccess配置,一定要把规则放在# BEGIN WordPress标记的上方,避免被WordPress默认规则覆盖,参考规则如下:
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^compare/([a-zA-Z0-9\-_]+)-vs-([a-zA-Z0-9\-_]+)-vs-([a-zA-Z0-9\-_]+)-vs-([a-zA-Z0-9\-_]+)/?$ /compare/?items=$1,$2,$3,$4 [L] RewriteRule ^compare/([a-zA-Z0-9\-_]+)-vs-([a-zA-Z0-9\-_]+)-vs-([a-zA-Z0-9\-_]+)/?$ /compare/?items=$1,$2,$3 [L] RewriteRule ^compare/([a-zA-Z0-9\-_]+)-vs-([a-zA-Z0-9\-_]+)/?$ /compare/?items=$1,$2 [L] </IfModule>
注意:每次触发WordPress重写规则刷新操作(保存固定链接、切换主题、启停插件)后,都需要手动检查.htaccess规则是否被覆盖,维护成本极高。
内容的提问来源于stack exchange,提问作者Daniel Iftimie
相关产品推荐
相关产品推荐

