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

求助:禁用WooCommerce重复产品分类URL的实现方案

解决WooCommerce产品分类别名变更后的重复URL SEO问题

问题背景

WooCommerce修改商品分类别名(slug)后,旧分类路径的产品URL(比如demoshop.com/cat-1/product-a)仍会返回200状态码,和新路径demoshop.com/modified/product-a指向同一产品,造成SEO重复内容问题。需求是:只有主分类对应的产品URL返回200,其他路径的URL直接301重定向到正确URL。

代码瓶颈解决

你之前的代码卡在两个点:无法获取完整请求URL、无法获取产品主分类slug,以下是针对性解决方法:

1. 正确获取当前请求的完整URL

之前的add_query_arg写法有误,改用以下代码获取包含协议、域名、路径和查询参数的完整URL:

global $wp;
$browser_url = home_url( add_query_arg( array(), $wp->request ) );
// 拼接查询参数(如果有)
if ( ! empty( $_SERVER['QUERY_STRING'] ) ) {
    $browser_url .= '?' . $_SERVER['QUERY_STRING'];
}

2. 获取产品的主分类slug

WooCommerce产品的主分类可以通过产品元数据或默认分类列表获取,优先支持Yoast SEO设置的主分类:

global $post;
if ( is_product() && $post ) {
    $product = wc_get_product( $post->ID );
    // 默认取第一个分类
    $primary_cat_id = $product->get_category_ids()[0];
    // 如果用了Yoast SEO,优先取它设置的主分类
    if ( $product->get_meta( '_yoast_wpseo_primary_product_cat' ) ) {
        $primary_cat_id = $product->get_meta( '_yoast_wpseo_primary_product_cat' );
    }
    // 获取分类slug
    $primary_cat_obj = get_term( $primary_cat_id, 'product_cat' );
    $cat_slug = $primary_cat_obj->slug;
}

完整重定向实现代码

将以下代码添加到主题的functions.php文件或自定义插件中:

add_action( 'template_redirect', 'wc_redirect_product_to_correct_url' );
function wc_redirect_product_to_correct_url() {
    // 仅在产品页执行逻辑
    if ( ! is_product() ) return;

    global $wp, $post;
    $product = wc_get_product( $post->ID );

    // 获取当前用户请求的完整URL
    $browser_url = home_url( add_query_arg( array(), $wp->request ) );
    if ( ! empty( $_SERVER['QUERY_STRING'] ) ) {
        $browser_url .= '?' . $_SERVER['QUERY_STRING'];
    }

    // 获取主分类slug
    $primary_cat_id = $product->get_category_ids()[0];
    if ( $product->get_meta( '_yoast_wpseo_primary_product_cat' ) ) {
        $primary_cat_id = $product->get_meta( '_yoast_wpseo_primary_product_cat' );
    }
    $primary_cat_obj = get_term( $primary_cat_id, 'product_cat' );
    $primary_cat_slug = $primary_cat_obj->slug;

    // 生成基于主分类的正确产品URL
    $correct_url = get_permalink( $post->ID );
    // 解析并替换URL中的分类部分(适配/%product_cat%/%product%/的固定链接结构)
    $correct_path = parse_url( $correct_url, PHP_URL_PATH );
    $path_parts = explode( '/', trim( $correct_path, '/' ) );
    if ( count( $path_parts ) >= 2 ) {
        $path_parts[0] = $primary_cat_slug;
        $corrected_path = implode( '/', $path_parts );
        $correct_url = home_url( '/' . $corrected_path . '/' );
        // 拼接查询参数
        if ( ! empty( $_SERVER['QUERY_STRING'] ) ) {
            $correct_url .= '?' . $_SERVER['QUERY_STRING'];
        }
    }

    // 对比URL,不一致则301重定向
    if ( $browser_url !== $correct_url ) {
        wp_safe_redirect( $correct_url, 301 );
        exit;
    }
}

注意事项

  • 确保你的WooCommerce固定链接结构设置为/%product_cat%/%product%/,如果是其他结构,需要调整代码中拆分路径的逻辑
  • 未使用Yoast SEO的话,可注释掉主分类元数据的判断代码,默认取第一个分类
  • 测试前清空网站缓存,避免缓存影响重定向效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:27:23