You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移除自定义文章类型基础别名,实现分类+标题或仅标题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:24:55