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

WooCommerce零小数设置下仅让折扣金额保留两位小数的方案咨询

解决WooCommerce仅对特定支付方式折扣保留两位小数的问题

你当前的核心问题是:全局修改小数位数的过滤器会影响运费,需要实现仅让钱包支付的折扣保留两位小数,其他金额仍沿用后台设置的零小数规则。以下是两种可行的解决方案:

方法一:针对特定折扣费用单独调整小数位数

通过woocommerce_fee_amount过滤器精准识别钱包折扣费用,单独为其设置两位小数,不干扰其他金额计算:

  1. 修改你的折扣代码,确保折扣计算时先保留两位小数,并保留标识便于后续识别:
add_filter( 'woocommerce_cart_calculate_fees', 'discount_based_on_payment_method_e643e', 10, 1 );
function discount_based_on_payment_method_e643e( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( ! ( is_checkout() && ! is_wc_endpoint_url() ) )
        return;
    
    $targeted_payment_method = 'wallet';
    global $abc_options;
    $wallet_pay_discount_amount = $abc_options['wallet_payment_discount_amount_value'];
    $wallet_pay_discount_amount_formated = $wallet_pay_discount_amount / 100;
    
    if( WC()->session->get('chosen_payment_method') === $targeted_payment_method ) {
        $cart_subtotal = WC()->cart->get_subtotal();
        // 提前用WooCommerce工具函数保留两位小数,避免计算误差
        $discount = wc_format_decimal($cart_subtotal * $wallet_pay_discount_amount_formated, 2);

        $fee_description = '~ ' . $wallet_pay_discount_amount . '% ' . __('Discount Wallet Payment', 'nm-ffk');
        $cart->add_fee($fee_description, -$discount);
    }
}   
  1. 添加专属过滤器,仅对钱包折扣费用应用两位小数规则:
add_filter( 'woocommerce_fee_amount', 'custom_wallet_discount_decimals', 10, 2 );
function custom_wallet_discount_decimals( $amount, $fee ) {
    // 通过费用描述中的关键词识别钱包折扣
    if ( strpos( $fee->name, __('Discount Wallet Payment', 'nm-ffk') ) !== false ) {
        return wc_format_decimal( $amount, 2 );
    }
    // 其他费用沿用后台默认的零小数设置
    return $amount;
}
  1. 移除你之前添加的wc_get_price_decimals全局过滤器,避免影响运费等其他金额。

方法二:手动精确计算折扣并强制保留两位小数

如果不想新增过滤器,可直接在折扣计算环节处理精度,同时避免系统自动四舍五入:

修改折扣代码如下:

add_filter( 'woocommerce_cart_calculate_fees', 'discount_based_on_payment_method_e643e', 10, 1 );
function discount_based_on_payment_method_e643e( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( ! ( is_checkout() && ! is_wc_endpoint_url() ) )
        return;
    
    $targeted_payment_method = 'wallet';
    global $abc_options;
    $wallet_pay_discount_amount = $abc_options['wallet_payment_discount_amount_value'];
    $wallet_pay_discount_amount_formated = $wallet_pay_discount_amount / 100;
    
    if( WC()->session->get('chosen_payment_method') === $targeted_payment_method ) {
        $cart_subtotal = WC()->cart->get_subtotal();
        // 精确计算并强制保留两位小数,转换为float类型避免系统自动四舍五入
        $discount = (float)number_format( round( $cart_subtotal * $wallet_pay_discount_amount_formated, 2 ), 2, '.', '' );

        $fee_description = '~ ' . $wallet_pay_discount_amount . '% ' . __('Discount Wallet Payment', 'nm-ffk');
        $cart->add_fee($fee_description, -$discount);
    }
}   

同样需要移除之前的wc_get_price_decimals全局过滤器,确保运费等其他金额仍保持零小数显示。

测试注意事项

  • 清空购物车后重新添加商品并选择支付方式,确保Session数据更新
  • 若使用多语言,需保证__('Discount Wallet Payment', 'nm-ffk')的翻译一致,避免过滤器无法识别折扣费用

内容的提问来源于stack exchange,提问作者eva last

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:40:13