如何在WooCommerce商品列表及详情页统一添加NEW徽章并排除指定分类
WooCommerce「NEW」徽章优化方案
1. 让徽章同时显示在商品列表页和详情页
直接把同一个函数挂载到商品列表页和详情页的对应钩子上即可,无需重复编写函数。修改后的完整代码如下:
// 同时挂载列表页和详情页的钩子 add_action( 'woocommerce_before_shop_loop_item_title', 'display_new_badge', 3 ); add_action( 'woocommerce_before_single_product_summary', 'display_new_badge', 3 ); function display_new_badge() { global $product; // 过滤非产品对象场景,避免报错 if ( ! $product instanceof WC_Product ) { return; } $newness_days = 270; $created_time = strtotime( $product->get_date_created() ); // 判断是否为新品并输出徽章 if ( ( time() - ( 60 * 60 * 24 * $newness_days ) ) < $created_time ) { echo '<span class="itsnew">' . esc_html__( 'N E W', 'woocommerce' ) . '</span>'; } }
关键改动说明:
- 给函数起了更通用的名字
display_new_badge - 新增
$product instanceof WC_Product判断,防止非产品页面出现报错 - 同时添加详情页钩子
woocommerce_before_single_product_summary,保持和列表页一致的优先级(3),确保显示位置统一
2. 让徽章不显示在指定分类的商品上
你之前的代码失效,是因为has_term默认检测的是普通文章分类(category),而WooCommerce产品分类的专属标识是product_cat,必须明确指定。修改后的代码如下:
// 同时挂载列表页和详情页的钩子 add_action( 'woocommerce_before_shop_loop_item_title', 'display_new_badge', 3 ); add_action( 'woocommerce_before_single_product_summary', 'display_new_badge', 3 ); function display_new_badge() { global $product; if ( ! $product instanceof WC_Product ) { return; } $newness_days = 270; $created_time = strtotime( $product->get_date_created() ); // 填写需要排除的产品分类slug(支持多个,用数组) $exclude_cats = array( 'sale', 'clearance' ); // 满足「是新品 + 不在排除分类」才显示徽章 if ( ( time() - ( 60 * 60 * 24 * $newness_days ) ) < $created_time && ! has_term( $exclude_cats, 'product_cat', $product->get_id() ) ) { echo '<span class="itsnew">' . esc_html__( 'N E W', 'woocommerce' ) . '</span>'; } }
关键改动说明:
- 用数组
$exclude_cats可以一次性添加多个要排除的分类slug(比如sale、清仓对应的slug) - 在
has_term中明确指定产品分类标识product_cat,同时传入产品ID$product->get_id(),确保判断逻辑准确 - 逻辑调整为「是新品且不属于排除分类」时才显示徽章
如果只需要排除单个分类,直接写! has_term( 'sale', 'product_cat', $product->get_id() )即可。
内容的提问来源于stack exchange,提问作者user11923233
相关产品推荐
相关产品推荐

