
本文介绍如何在 woocommerce 商品列表页中,精准显示每个商品所属的顶级(父级)产品分类名称,避免默认显示子分类的问题,并提供可直接使用的 php 代码及关键注意事项。
本文介绍如何在 woocommerce 商品列表页中,精准显示每个商品所属的顶级(父级)产品分类名称,避免默认显示子分类的问题,并提供可直接使用的 php 代码及关键注意事项。
在 WooCommerce 默认行为中,wp_get_post_terms() 返回的商品分类数组按数据库顺序排列,通常为最近分配或层级最深的子分类优先,因此直接使用 array_shift() 获取首个分类会导致显示的是子分类而非用户期望的父分类。要确保只显示顶级分类(即无上级父类的分类),核心逻辑是:遍历所有关联分类,筛选出 parent 属性为 0 的分类——这是 WordPress 分类体系中判定顶级分类的可靠标准(子分类的 parent 值为其父分类的 ID)。
以下是经过优化、健壮且可直接集成到主题 functions.php 文件中的完整代码:
function wpa89819_wc_single_product() {
$product_id = get_the_ID();
$product_cats = wp_get_post_terms( $product_id, 'product_cat', array( 'fields' => 'all' ) );
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 );
✅ 关键改进说明:
- 使用 esc_html() 对分类名称进行输出转义,防止 XSS 漏洞,提升安全性;
- 添加 ! empty( $product_cats ) 判断,避免空数组导致的潜在逻辑异常;
- 显式指定 wp_get_post_terms() 的 'fields' => 'all' 参数,确保 $cat->parent 可靠可用(默认 'fields' => 'ids' 时该属性不可用);
- break 确保仅显示一个顶级分类(即使商品同时归属多个顶级分类,也仅展示首个匹配项;如需全部显示,可移除 break 并调整 HTML 结构)。
⚠️ 注意事项:
- 若某商品仅归属子分类而未直接归属任何顶级分类(例如仅分配了“无线耳机”→“蓝牙耳机”→“降噪耳机”中的最末级),上述代码将不输出任何内容。此时建议在后台为商品同时勾选其直接父级或顶级分类,以保障前端展示一致性;
- 如需支持多语言站点,请确保分类名称已通过 get_term_translation()(配合 WPML)或 icl_t()(兼容性处理)适配翻译;
- 修改后请清除对象缓存(如启用 Redis/Memcached)及页面缓存插件(如 WP Rocket)的缓存,以确保效果即时生效。
该方案简洁、安全、符合 WordPress 编码规范,适合初学者理解与复用,亦能满足生产环境的稳定性要求。










