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

WooCommerce未设置促销价时如何显示自定义Sale Badge

问题根源

WooCommerce默认只有检测到商品设置了有效促销价时,才会触发woocommerce_sale_flash过滤器渲染促销徽章。你之前写的自定义徽章文本代码逻辑本身没有问题,但无促销价时整个徽章渲染流程被内核提前终止,代码根本不会执行,自然看不到效果。

调整方案

分两步实现需求,所有代码添加到子主题的functions.php文件或者自定义功能插件中即可:

  • 改写WooCommerce的商品促销状态判断逻辑,只要商品设置了大于0的常规价格、处于在售库存状态,就判定为需要显示促销徽章,绕过内核默认的"必须有促销价才显示"的限制
  • 修正原有自定义徽章代码的兼容性问题,移除冗余的全局变量调用,改用WooCommerce官方提供的对象方法获取商品信息,兼容高版本WooCommerce的HPOS特性。
完整实现代码
// 强制有常规价格的在售商品显示促销徽章
add_filter( 'woocommerce_product_is_on_sale', 'custom_force_sale_badge_display', 10, 2 );
function custom_force_sale_badge_display( $is_on_sale, $product ) {
    // 无库存商品不显示徽章
    if ( ! $product->is_in_stock() ) {
        return false;
    }
    // 只要设置了非0常规价格,就允许显示徽章
    $regular_price = (float) $product->get_regular_price();
    if ( $regular_price > 0 ) {
        return true;
    }
    return $is_on_sale;
}

// 自定义不同分类下的徽章显示文本
add_filter( 'woocommerce_sale_flash', 'woocommerce_custom_sale_text', 10, 3 );
function woocommerce_custom_sale_text( $text, $post, $product ) {
    if ( ! $product->is_in_stock() ) {
        return '';
    }

    $product_id = $product->get_id();
    if ( has_term( 'one', 'product_cat', $product_id ) ) {
        return '<span class="onsale">one</span>';
    }
    if ( has_term( 'two', 'product_cat', $product_id ) ) {
        return '<span class="onsale">two</span>';
    }
    if ( has_term( 'three', 'product_cat', $product_id ) ) {
        return '<span class="onsale">three</span>';
    }
    
    return '<span class="onsale">Sale</span>';
}
注意事项
  • 不要将代码添加到主主题的functions.php中,否则主题更新时代码会被覆盖
  • 代码兼容WooCommerce 7.0+版本,支持HPOS自定义订单表存储模式,不要直接调用$product->id获取商品ID,否则高版本环境下会抛出兼容错误
  • 如果需要对特定商品、特定分类隐藏徽章,直接在custom_force_sale_badge_display函数中添加对应判断,返回false即可

内容的提问来源于stack exchange,提问作者Julius M Sapija

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:01:19