WordPress 5.8自定义文章类型移除rewrite base slug后普通页面404如何解决
直接设置'slug' => '/'触发404的核心原因是WordPress重写规则优先级错乱,CPT的查询规则会优先于原生页面/文章的规则,导致所有非明确匹配的请求都会被导向CPT查询,匹配失败就直接返回404,不会继续匹配原生内容规则。
完整可落地解决方案
第一步:修正自定义文章类型注册参数
先把你原来注册CPT代码里的rewrite部分修改为默认配置,不要直接指向根路径:
'rewrite' => array( 'slug' => 'product', // 保留默认的CPT slug,不要填/ 'with_front' => false, ),
第二步:添加功能代码实现无前缀访问
将以下代码添加到你的主题functions.php文件或者自定义功能插件中:
// 1. 修改CPT的固定链接输出,自动去掉前缀 add_filter( 'post_type_link', 'remove_cpt_slug_prefix', 10, 3 ); function remove_cpt_slug_prefix( $post_link, $post, $leavename ) { // 这里填入你需要移除前缀的CPT slug,多个的话用逗号分隔即可 $allowed_cpts = array( 'product' ); if ( in_array( $post->post_type, $allowed_cpts ) && 'publish' === $post->post_status ) { $post_link = str_replace( '/' . $post->post_type . '/', '/', $post_link ); } return $post_link; } // 2. 解析请求时找不到页面的情况下优先匹配CPT内容,不影响原生页面正常访问 add_action( 'pre_get_posts', 'parse_cpt_without_prefix', 1 ); function parse_cpt_without_prefix( $query ) { // 只处理前端主查询,不影响后台和其他自定义查询 if ( ! $query->is_main_query() || is_admin() ) { return; } // 仅当查询触发404时,才去匹配CPT内容,保证原生页面优先级更高 if ( ! empty( $query->query['pagename'] ) ) { $allowed_cpts = array( 'product' ); // 和上一段代码的配置保持一致 // 合并查询类型,同时匹配页面、文章、指定CPT $query->set( 'post_type', array_merge( array( 'page', 'post' ), $allowed_cpts ) ); } }
第三步:刷新重写规则
代码添加完成后,进入WordPress后台「设置」-「固定链接」,直接点击「保存更改」即可,不需要修改任何配置,操作完成后规则就会生效,你的层级CPT链接会自动变成mydomain.com/parent/child的格式,普通页面也不会再出现404问题。
多自定义文章类型适配
如果你需要给多个CPT移除前缀,只需要把上面两段代码里的$allowed_cpts数组的值,替换成你所有需要处理的CPT的slug即可,示例:
$allowed_cpts = array( 'product', 'service', 'case' );
内容的提问来源于stack exchange,提问作者Ronan
相关产品推荐
相关产品推荐

