求助:禁用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
相关产品推荐
相关产品推荐

