如何让WooCommerce指定同层级分类生成产品URL与面包屑?
解决WooCommerce产品指定分类生成URL和面包屑的问题
WooCommerce默认使用%product_cat%生成URL时,会优先选择分类ID最小的分类(而非你设置的“主要分类”),尤其是当产品属于同层级多个分类时。以下是无需额外插件的代码解决方案:
一、强制URL使用指定分类
将以下代码添加到主题的functions.php文件,或使用代码片段插件(如Code Snippets):
add_filter( 'woocommerce_product_permalink_structure', 'custom_force_product_permalink_target_cat' ); function custom_force_product_permalink_target_cat( $permalink ) { global $post; if ( $post->post_type !== 'product' ) return $permalink; // 替换为你需要优先使用的目标分类SLUG $target_cat_slug = 'your-target-category-slug'; $product_cats = get_the_terms( $post->ID, 'product_cat' ); if ( $product_cats && ! is_wp_error( $product_cats ) ) { // 遍历分类,匹配目标分类 foreach ( $product_cats as $cat ) { if ( $cat->slug === $target_cat_slug ) { return str_replace( '%product_cat%', $cat->slug, $permalink ); } } // 未找到目标分类时, fallback到第一个分类 $first_cat = reset( $product_cats ); return str_replace( '%product_cat%', $first_cat->slug, $permalink ); } return $permalink; }
注意事项:
- 将
your-target-category-slug替换为实际的目标分类SLUG(可在后台产品分类编辑页查看); - 代码生效后,前往后台→设置→固定链接,点击「保存更改」刷新URL规则;
- 若已有产品URL错误,可使用「Regenerate Permalinks」插件批量重新生成URL。
二、修改面包屑显示指定分类
如果需要同时修正面包屑的分类路径,添加以下代码:
add_filter( 'woocommerce_get_breadcrumb', 'custom_force_product_breadcrumb_target_cat' ); function custom_force_product_breadcrumb_target_cat( $crumbs ) { global $post; if ( ! is_product() || $post->post_type !== 'product' ) return $crumbs; // 替换为目标分类SLUG $target_cat_slug = 'your-target-category-slug'; $product_cats = get_the_terms( $post->ID, 'product_cat' ); if ( $product_cats && ! is_wp_error( $product_cats ) ) { $target_cat = null; foreach ( $product_cats as $cat ) { if ( $cat->slug === $target_cat_slug ) { $target_cat = $cat; break; } } if ( $target_cat ) { // 构建目标分类的完整层级面包屑 $cat_ancestors = array_reverse( get_ancestors( $target_cat->term_id, 'product_cat', 'taxonomy' ) ); $cat_breadcrumbs = []; foreach ( $cat_ancestors as $ancestor_id ) { $ancestor = get_term( $ancestor_id, 'product_cat' ); $cat_breadcrumbs[] = [ $ancestor->name, get_term_link( $ancestor ) ]; } $cat_breadcrumbs[] = [ $target_cat->name, get_term_link( $target_cat ) ]; // 替换原有面包屑中的分类部分 $new_crumbs = []; foreach ( $crumbs as $crumb ) { $new_crumbs[] = $crumb; // 匹配面包屑中的「产品」节点(根据你的商店设置修改文字) if ( $crumb[0] === '产品' ) { $new_crumbs = array_merge( $new_crumbs, $cat_breadcrumbs ); break; } } // 添加当前产品名称到面包屑末尾 $new_crumbs[] = [ get_the_title(), '' ]; return $new_crumbs; } } return $crumbs; }
额外优化:
如果你使用Yoast SEO设置了「主要分类」,可以将代码中获取目标分类的逻辑替换为:
// 替换原有的$target_cat查找逻辑 $primary_cat_id = get_post_meta( $post->ID, '_yoast_wpseo_primary_product_cat', true ); if ( $primary_cat_id ) { $target_cat = get_term( $primary_cat_id, 'product_cat' ); }
这样就能直接复用Yoast设置的主要分类,无需硬编码SLUG。
内容的提问来源于stack exchange,提问作者TBJ
相关产品推荐
相关产品推荐

