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
相关产品推荐
相关产品推荐

