You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:06:24