You need to enable JavaScript to run this app. WordPress为CPT添加rewrite_rule后访问子路径加载错误模板如何解决
优惠活动
大模型
产品
解决方案
定价
更多

WordPress为CPT添加rewrite_rule后访问子路径加载错误模板如何解决

问题原因与解决方案

核心错误

你的重写规则里使用了错误的查询参数:WordPress中用于匹配文章别名的公开查询变量是name,而非postname。postname是文章对象的属性值,不会被WP_Query识别为查询条件,因此你当前的规则实际只传递了post_type=tvshow参数,WordPress自然会识别为tvshow的归档请求,加载归档模板。

修复步骤

  • 第一步:修正查询参数:将规则中的postname=$matches[1]改为name=$matches[1],同时可以将episode的正则调整为更严谨的([^/]+)避免空值匹配,修改后的代码如下:
function setup_new_var() {
   add_rewrite_tag( '%episode%', '([^/]+)' );
   
   add_rewrite_rule( '^tvshow/([^/]+)/episode/([^/]+)/?$', 
    'index.php?post_type=tvshow&name=$matches[1]&episode=$matches[2]', 'top' );
}
add_action( 'init', 'setup_new_var', 1);
  • 第二步:刷新重写规则:进入WordPress后台「设置」→「固定链接」,无需修改任何配置,直接点击底部的「保存更改」按钮,清空旧的重写规则缓存。
  • 可选:排查参数冲突:如果修改后还是加载归档页,检查站点是否存在名称为episode的自定义分类法或其他已注册的查询变量,重名会导致查询逻辑被篡改,你可以将%episode%重命名为%tv_episode%这类不会冲突的名称即可。
  • 可选:强制指定模板:如果需要让携带episode参数的请求加载指定模板,可以添加template_include钩子实现:
add_filter( 'template_include', 'load_tv_episode_template' );
function load_tv_episode_template( $template ) {
    if ( get_query_var( 'episode' ) && get_post_type() === 'tvshow' ) {
        // 优先使用主题根目录下的single-tvshow-episode.php模板,不存在则用single-tvshow.php
        $new_template = locate_template( array( 'single-tvshow-episode.php', 'single-tvshow.php' ) );
        if ( !empty( $new_template ) ) {
            return $new_template;
        }
    }
    return $template;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 16:00:05