You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用WordPress add_rewrite_rule()修改特定前缀文章URL失败,请求排查错误

问题分析与修复方案

你的代码没生效主要有两个核心问题,加上一个容易遗漏的关键操作,我来一步步拆解说明:

1. 错误使用了pagename查询参数

你的目标文章是采用%postname%固定链接的博客文章(Post),但pagename是WordPress专为静态页面(Page)设计的查询参数。对于博客文章,应该用name参数来匹配文章的slug。

2. 重写规则的逻辑方向有误

原规则试图把my-news/postname映射到news/mypost-$matches[1],但我们实际需要的是:访问my-news/postname时能正确加载slug为mypost-postname的文章;同时,这类文章的前台永久链接要自动显示为my-news/postname,而非原来的news/mypost-postname

完整修复代码

替换你原来的代码为以下内容:

add_action( 'init', 'custom_mynews_rewrite_rule' );
function custom_mynews_rewrite_rule() {
    // 添加重写规则:匹配my-news/xxx格式的URL,加载对应slug为mypost-xxx的文章
    add_rewrite_rule(
        '^my-news/([^/]+)/?$',
        'index.php?name=mypost-$matches[1]',
        'top'
    );
}

// 过滤文章的永久链接,让slug以mypost-开头的文章显示为my-news/xxx格式
add_filter( 'post_link', 'custom_mynews_permalink', 10, 2 );
function custom_mynews_permalink( $permalink, $post ) {
    // 只处理已发布的文章
    if ( $post->post_status !== 'publish' ) {
        return $permalink;
    }
    
    // 检查文章slug是否以mypost-开头
    if ( str_starts_with( $post->post_name, 'mypost-' ) ) {
        // 截掉slug开头的mypost-前缀
        $new_slug = substr( $post->post_name, 7 ); // "mypost-"共7个字符
        // 构建并返回新的永久链接
        return home_url( "/my-news/{$new_slug}/" );
    }
    
    return $permalink;
}

3. 必须执行的关键操作:刷新重写规则

代码添加后,一定要刷新WordPress的重写规则才能让新规则生效:

  • 登录WordPress后台,进入设置 → 固定链接页面
  • 无需修改任何设置,直接点击页面底部的「保存更改」按钮即可

验证效果

完成上述操作后,你可以做两个验证:

  1. 手动访问http://example.com/my-news/postname,确认能正常打开slug为mypost-postname的文章
  2. 打开该文章的前台页面,检查浏览器地址栏的URL是否自动显示为my-news/postname格式

内容的提问来源于stack exchange,提问作者A.F.Kay

火山引擎 最新活动