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

WordPress自定义文章类型houses不同sizes分类下动态重写slug被判定重复

问题根源

WordPress 校验文章 slug 唯一性的逻辑默认仅对比同一文章类型下的 post_name 字段值,不会识别你动态拼接的分类法前缀,所以只要是houses类型的文章,哪怕分属不同的sizes分类,只要原始slug都是red-house,系统就会判定重复,自动追加-2后缀。
另外你现有的动态重写slug代码存在参数错误:wp_get_object_terms的第二个参数应该填写分类法名称sizes,你错写为文章类型名称houses,会导致分类法术语读取失败。


完整修复方案

你需要先修正动态链接生成函数的错误,再添加过滤器修改WordPress默认的slug唯一性校验逻辑,允许不同sizes分类下的文章使用相同的基础slug。

修复后的完整代码

首先是修正后的动态链接生成代码:

function houses_link( $post_link, $post )
{
    if ( $post->post_type !== 'houses' ) {
        return $post_link;
    }
    $terms = wp_get_object_terms( $post->ID, 'sizes' );
    if( !is_wp_error($terms) && !empty($terms) ) {
        return str_replace( '%sizes%' , $terms[0]->slug , $post_link );
    }
    // 未分配分类时默认占位,可自行修改
    return str_replace( '%sizes%' , 'uncategorized' , $post_link );  
}
add_filter( 'post_type_link', 'houses_link', 10, 2 );

然后添加slug唯一性校验的过滤器代码:

add_filter( 'wp_unique_post_slug', 'custom_houses_unique_slug', 10, 6 );
function custom_houses_unique_slug( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    if ( $post_type !== 'houses' ) {
        return $slug;
    }
    // 获取当前文章的sizes分类
    $terms = wp_get_object_terms( $post_ID, 'sizes' );
    if ( is_wp_error($terms) || empty($terms) ) {
        return $slug;
    }
    $current_term_slug = $terms[0]->slug;
    global $wpdb;
    // 仅检查同分类下是否存在相同slug的文章
    $exists = $wpdb->get_var( $wpdb->prepare(
        "SELECT p.ID FROM $wpdb->posts p
        INNER JOIN $wpdb->term_relationships tr ON p.ID = tr.object_id
        INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
        INNER JOIN $wpdb->terms t ON tt.term_id = t.term_id
        WHERE p.post_type = 'houses' AND p.post_name = %s AND t.slug = %s AND p.ID != %d AND tt.taxonomy = 'sizes'",
        $original_slug,
        $current_term_slug,
        $post_ID
    ) );
    // 同分类下无重复则直接返回原始slug,不需要加后缀
    if ( !$exists ) {
        return $original_slug;
    }
    return $slug;
}

后续生效操作

代码添加到主题functions.php或自定义插件后,执行以下操作:

  • 提前备份网站数据,避免操作失误导致异常
  • 将之前被追加了-2的文章slug手动修改为你需要的原始值
  • 进入后台「设置」→「固定链接」,直接点击「保存更改」刷新重写规则即可生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:27:00