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

WordPress使用add_rewrite_rule实现URL重写不生效如何解决

代码不生效的核心原因

你写的规则有两个致命问题,根本跑不起来:

  • add_rewrite_rule的本质是把匹配到的URL映射到WordPress内部的查询参数,不是直接做路径替换。你直接把目标写成/5thbase/?,WordPress解析不到任何合法查询变量,只会返回404。
  • 正则规则写得不对,只匹配了3rdbase/4thbase段,没把路径前面的base/、2ndbase/前缀纳入匹配范围,根本匹配不到你要重写的目标URL。
可直接用的实现代码

先明确需求分两种场景,选对应代码放到主题的functions.php文件里即可。

场景1:内部重写(访问旧URL地址不变,展示新路径内容)

如果不需要改变地址栏的URL,只是让旧路径加载/2ndbase/3rdbase/5thbase对应的页面内容,用下面的代码:

function custom_rewrite_base_path() {
    add_rewrite_rule(
        '^base/([^/]+)/([^/]+)/4thbase/?$',
        'index.php?pagename=$matches[1]/$matches[2]/5thbase',
        'top'
    );
}
add_action('init', 'custom_rewrite_base_path');

重要操作:代码上传后,登录WordPress后台进入「设置-固定链接」页面,什么都不用改,直接点底部的「保存更改」按钮,刷新重写规则缓存,否则规则不会生效。

如果5thbase不是普通WP页面,是文章、自定义文章类型或者分类页,把第二个参数里的pagename换成对应查询变量即可:文章用name,自定义文章类型用对应类型的注册query_var,分类页用category_name。

场景2:301永久跳转(访问旧URL自动跳到新路径,地址栏更新)

如果是做路径迁移,需要让访问旧地址的用户自动跳转到新URL,不要用add_rewrite_rule,直接用模板跳转钩子兼容性更好:

function custom_old_path_redirect() {
    $current_path = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
    if (preg_match('#^base/([^/]+)/([^/]+)/4thbase/?$#', $current_path, $path_matches)) {
        $target_url = home_url(sprintf('/%s/%s/5thbase/', $path_matches[1], $path_matches[2]));
        wp_redirect($target_url, 301);
        exit;
    }
}
add_action('template_redirect', 'custom_old_path_redirect');
避坑提醒
  • 不要尝试在add_rewrite_rule的第二个参数直接写静态路径,WordPress的重写规则是路由到内部查询,不是做服务器层面的路径替换。
  • 正则匹配尽量写完整路径规则,不要只匹配末尾片段,避免误匹配其他同后缀的URL。
  • 每次修改重写规则后必须刷新固定链接缓存,这是90%的人写重写规则不生效的首要原因。

内容的提问来源于stack exchange,提问作者Rodtron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:54:32