跳到主要内容

On-Sale 徽章 阻止

On-Sale 徽章 阻止在正在促销的产品上显示一个 "Sale" 徽章。

注意: 此阻止使用别名 woocommerce/product-sale-badge

woocommerce_sale_badge_text

描述

woocommerce_sale_badge_text 过滤器允许根据产品上下文自定义促销徽章文本。

参数

  • $sale_text string (默认: 'Sale') - 促销徽章文本。
  • $product WC_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_textwoocommerce_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.0WooCommerce 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>'; // 显示为 "&lt;strong&gt;Hot Deal&lt;/strong&gt;"
}, 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 过滤器 代替。