
本文介绍如何在 woocommerce 商品列表页中,仅显示每个商品所属的顶级(父级)产品分类,避免默认显示最深层子分类的问题,并提供安全可靠的 php 代码实现。
本文介绍如何在 woocommerce 商品列表页中,仅显示每个商品所属的顶级(父级)产品分类,避免默认显示最深层子分类的问题,并提供安全可靠的 php 代码实现。
在 WooCommerce 默认行为中,wp_get_post_terms() 返回的商品分类数组通常按层级顺序排列,且 array_shift() 会取第一个(即最靠前的)分类——这往往是深度最深的子分类,而非我们期望的“父分类”。要精准展示唯一且顶层的分类(即没有父级的分类,$cat->parent === 0),需遍历所有关联分类并主动筛选。
以下为推荐使用的优化代码,已适配 WooCommerce 主题循环结构,可直接添加至当前子主题的 functions.php 文件中:
function wpa89819_wc_single_product() {
$product_cats = wp_get_post_terms( get_the_ID(), 'product_cat' );
// 检查是否获取到有效分类(排除 WP_Error 及空数组)
if ( ! is_wp_error( $product_cats ) && ! empty( $product_cats ) ) {
foreach ( $product_cats as $cat ) {
// 判断是否为顶级分类:parent 值为 0 表示无上级分类
if ( $cat->parent === 0 ) {
echo '<h6 class="woocommerce-loop-product__title">' . esc_html( $cat->name ) . '</h6>';
break; // 找到首个顶级分类即停止,确保只显示一个
}
}
}
}
add_action( 'woocommerce_after_shop_loop_item_title', 'wpa89819_wc_single_product', 2 );
✅ 关键改进说明:
- 使用 foreach 遍历全部分类,而非依赖顺序取首项;
- 通过 $cat->parent === 0 精准识别顶级分类(WooCommerce 分类体系中,根级分类的 parent 字段恒为整数 0);
- 添加 ! empty( $product_cats ) 防御性检查,避免空数组导致逻辑异常;
- 使用 esc_html() 对输出内容进行转义,防止 XSS 风险,提升安全性;
- break 确保即使某商品同时归属多个顶级分类(极少见),也仅显示第一个,保持界面简洁统一。
⚠️ 注意事项:
- 若您的分类结构存在多级嵌套但无严格单根父级(例如同一商品同时属于两个不同顶级分类),该方案将显示第一个匹配的顶级分类;如需自定义优先级(如按ID、名称排序),可扩展 usort() 排序逻辑;
- 请勿在父主题中直接修改 functions.php,务必使用子主题以保障更新安全;
- 启用后若未生效,请确认钩子位置是否正确(woocommerce_after_shop_loop_item_title 适用于商品网格/列表循环),并检查主题是否已覆盖或移除了该动作钩子。
该方案兼顾健壮性、可读性与安全性,适合初学者理解并复用,是 WooCommerce 分类展示场景下的最佳实践之一。










