




本文介绍如何在 woocommerce 商品目录页(shop loop)中,为每个商品自动显示其所属首个产品分类(product_cat)的自定义缩略图徽章,兼容响应式尺寸与占位图回退机制。
在 WooCommerce 中,默认的商品循环(woocommerce_before_shop_loop_item_title 钩子)不包含分类缩略图展示功能。若需在商品标题上方统一显示其所属首个产品分类的自定义徽章(如品牌图标、品类标识等),应避免遍历全部分类或依赖硬编码 slug(如 'sunglasses'),而应采用健壮、可扩展的方式实现。
以下是一段经过优化的专业级代码,推荐添加至当前子主题的 functions.php 文件中:
/**
* 在商品列表页顶部显示首个产品分类的缩略图徽章
* 支持 WooCommerce 原生图片尺寸、srcset 响应式适配及占位图回退
*/
add_action('woocommerce_before_shop_loop_item_title', 'display_product_category_thumbnail', 20);
function display_product_category_thumbnail()
{
global $product;
// 获取当前商品的所有 product_cat 分类,并取第一个(按层级顺序,通常为最具体分类)
$terms = get_the_terms($product->get_id(), 'product_cat');
if (empty($terms) || is_wp_error($terms)) {
return;
}
$first_category = reset($terms); // 等价于 array_shift(),但不修改原数组
// 获取分类缩略图 ID(WooCommerce 4.4+ 推荐使用 term 
meta 的 thumbnail_id 字段)
$thumbnail_id = get_term_meta($first_category->term_id, 'thumbnail_id', true);
// 定义图片尺寸(复用 WooCommerce 标准缩略图配置)
$size = 'woocommerce_thumbnail'; // 对应 300×300 或自定义尺寸(见 WooCommerce → 设置 → 产品 → 显示)
$dimensions = wc_get_image_size($size);
// 构建图像 URL 及响应式属性
if ($thumbnail_id && wp_get_attachment_image_src($thumbnail_id, $size)) {
$image_data = wp_get_attachment_image_src($thumbnail_id, $size);
$image = is_array($image_data) ? $image_data[0] : '';
$srcset = function_exists('wp_get_attachment_image_srcset')
? wp_get_attachment_image_srcset($thumbnail_id, $size)
: false;
$sizes = function_exists('wp_get_attachment_image_sizes')
? wp_get_attachment_image_sizes($thumbnail_id, $size)
: false;
} else {
// 回退至 WooCommerce 占位图
$image = wc_placeholder_img_src();
$srcset = $sizes = false;
}
// 渲染徽章容器与图像(建议使用 CSS 控制宽高,而非内联 style)
if ($image) {
echo '';
echo '@@##@@name)) . '"'
. ' class="category-badge-img">';
echo '';
}
}✅ 关键改进说明:
⚠️ 注意事项:
通过以上实现,您将获得一个轻量、稳定、符合现代 Web 标准的分类徽章系统,显著提升商品列表页的信息传达效率与视觉专业度。
">