使用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后台,进入设置 → 固定链接页面
- 无需修改任何设置,直接点击页面底部的「保存更改」按钮即可
验证效果
完成上述操作后,你可以做两个验证:
- 手动访问
http://example.com/my-news/postname,确认能正常打开slug为mypost-postname的文章 - 打开该文章的前台页面,检查浏览器地址栏的URL是否自动显示为
my-news/postname格式
内容的提问来源于stack exchange,提问作者A.F.Kay




