On-Sale 徽章 阻止
On-Sale 徽章 阻止在正在促销的产品上显示一个 "Sale" 徽章。
注意: 此阻止使用别名
woocommerce/product-sale-badge。
woocommerce_sale_badge_text
描述
woocommerce_sale_badge_text 过滤器允许根据产品上下文自定义促销徽章文本。
参数
$sale_textstring(默认:'Sale') - 促销徽章文本。$productWC_Product- 产品对象。
返回值
string- 过滤后的促销徽章文本。
代码示例
基本示例
add_filter( 'woocommerce_sale_badge_text', 'custom_sale_badge_text', 10, 2 );
function custom_sale_badge_text( $sale_text, $product ) {
return __( 'On Sale', 'your-textdomain' );
}
特定产品的自定义
add_filter( 'woocommerce_sale_badge_text', 'custom_sale_badge_by_product_type', 10, 2 );
function custom_sale_badge_by_product_type( $sale_text, $product ) {
if ( $product->is_type( 'variable' ) ) {
return __( 'Save Now', 'your-textdomain' );
}
if ( $product->is_type( 'simple' ) ) {
return __( 'Limited Offer', 'your-textdomain' );
}
return $sale_text;
}
折扣百分比
add_filter( 'woocommerce_sale_badge_text', 'show_discount_percentage_badge', 10, 2 );
function show_discount_percentage_badge( $sale_text, $product ) {
if ( $product->is_type( 'simple' ) || $product->is_type( 'external' ) ) {
$regular_price = (float) $product->get_regular_price();
$sale_price = (float) $product->get_sale_price();
if ( $regular_price > 0 ) {
$percentage = round( ( ( $regular_price - $sale_price ) / $regular_price ) * 100 );
return sprintf( __( '-%s%%', 'your-textdomain' ), $percentage );
}
}
return $sale_text;
}
与 woocommerce_sale_flash 的区别
| 方面 | woocommerce_sale_badge_text | woocommerce_sale_flash |
|---|---|---|
| 上下文 | On-Sale 徽章 阻止 | 经典模板 (loop/sale-flash.php, single-product/sale-flash.php) |
| 输出 | 纯文本 | HTML 标记 |
| 参数 | $sale_text, $product | $html, $post, $product |
| 默认值 | 'Sale' | '<span class="onsale">Sale!</span>' |
| 自版本 | WooCommerce 10.0.0 | WooCommerce 2.x |
输出处理
块过滤器只接受纯文本。HTML 标签会被转义并以文本形式显示。
// 正确 - 纯文本
add_filter( 'woocommerce_sale_badge_text', function( $text, $product ) {
return 'Hot Deal';
}, 10, 2 );
// 错误 - HTML 会被转义
add_filter( 'woocommerce_sale_badge_text', function( $text, $product ) {
return '<strong>Hot Deal</strong>'; // 显示为 "<strong>Hot Deal</strong>"
}, 10, 2 );
经典过滤器期望的是 HTML 标记:
add_filter( 'woocommerce_sale_flash', function( $html, $post, $product ) {
return '<span class="onsale">Hot Deal</span>';
}, 10, 3 );
同时支持
为了同时支持块和经典主题,请实现两个过滤器:
// 块过滤器
add_filter( 'woocommerce_sale_badge_text', 'my_custom_sale_badge', 10, 2 );
function my_custom_sale_badge( $sale_text, $product ) {
return __( 'Special Offer', 'your-textdomain' );
}
// 经典过滤器
add_filter( 'woocommerce_sale_flash', 'my_classic_sale_flash', 10, 3 );
function my_classic_sale_flash( $html, $post, $product ) {
return '<span class="onsale">' . __( 'Special Offer', 'your-textdomain' ) . '</span>';
}
备注
- 只有当
$product->is_on_sale()返回true时,才会显示销售徽章。 - 块会使用
esc_html()对过滤器输出进行转义。 - 对于购物车和结账块,请使用
saleBadgePriceFormat过滤器 代替。