移除自定义文章类型基础别名,实现分类+标题或仅标题Permalink
解决自定义文章类型Permalink的404问题
我来帮你搞定这个自定义文章类型的 permalink 适配问题,你遇到的404是因为 rewrite 规则和查询逻辑没完全匹配上,咱们一步步调整:
1. 修正post_type_link过滤器函数
先把生成链接的逻辑捋得更严谨,只针对目标文章类型处理:
function ms_post_types_permalink_edit( $permalink, $post, $leavename ) { // 仅处理article和template这两个自定义文章类型 if ( !in_array( $post->post_type, [ 'article', 'template' ] ) ) { return $permalink; } // 获取文章关联的site_topic分类 $terms = wp_get_object_terms( $post->ID, 'site_topic' ); if ( !empty( $terms ) && !is_wp_error( $terms ) ) { // 替换post_type slug为分类术语 return str_replace( '/' . $post->post_type . '/', '/' . $terms[0]->slug . '/', $permalink ); } else { // 无分类时直接移除post_type slug return str_replace( '/' . $post->post_type . '/', '/', $permalink ); } } add_filter( 'post_type_link', 'ms_post_types_permalink_edit', 10, 3 );
2. 重新编写Rewrite规则
你之前的规则还带着article前缀,和咱们要的无slug结构不符,换成下面的规则,精准匹配两种URL格式:
function ms_post_types_rewrite_rule() { // 规则1:匹配带site_topic分类的URL → /分类术语/文章标题/ add_rewrite_rule( '^([^/]+)/([^/]+)/?$', 'index.php?site_topic=$matches[1]&article=$matches[2]', 'top' ); // 规则2:匹配无分类的URL → /文章标题/ add_rewrite_rule( '^([^/]+)/?$', 'index.php?article=$matches[1]', 'top' ); // 若template类型也需要相同规则,复制上述规则替换article为template即可 } add_action( 'init', 'ms_post_types_rewrite_rule' );
3. 调整pre_get_posts查询逻辑
让WordPress能正确识别这些URL对应的文章类型,同时处理分类与标题的查询匹配:
function ms_pre_get_posts( $query ) { // 仅处理前台主查询,跳过后台和副查询 if ( !$query->is_main_query() || is_admin() ) { return; } // 处理带分类的情况:同时存在site_topic和name参数 if ( isset( $query->query['site_topic'], $query->query['name'] ) ) { $query->set( 'post_type', 'article' ); return; } // 处理无分类的情况:仅存在name参数,且避免和页面(Page)冲突 if ( isset( $query->query['name'] ) && !isset( $query->query['page'] ) ) { $post_id = url_to_postid( home_url( $query->query['name'] ) ); // 优先判断是否为article类型文章 if ( $post_id && get_post_type( $post_id ) === 'article' ) { $query->set( 'post_type', 'article' ); } } } add_action( 'pre_get_posts', 'ms_pre_get_posts' );
4. 必做关键步骤:刷新Permalink缓存
每次修改rewrite规则后,一定要进入WordPress后台的「设置→固定链接」页面,不用改任何选项,直接点击「保存更改」,让WordPress更新rewrite规则缓存。
额外注意事项
- 若
template类型也需要同样的permalink结构,记得在rewrite规则和pre_get_posts中对应添加处理逻辑; - 确保自定义分类
site_topic的注册配置正确,建议设置'rewrite' => array( 'slug' => 'site-topic', 'with_front' => false ); - 若出现文章标题和页面(Page)slug冲突的情况,WordPress会优先匹配页面,你可以在pre_get_posts中调整优先级,或者避免使用重复slug。
内容的提问来源于stack exchange,提问作者Mel Macaluso
相关产品推荐
相关产品推荐

