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

WooCommerce:先计算BACS支付折扣再算运费的功能实现求助

WooCommerce BACS支付折扣与运费计算调整方案

核心实现代码

下面的代码可以实现你需要的逻辑:选择BACS支付时先打5%折扣,再用折扣后的金额判断是否符合免运费条件。

1. 添加BACS支付专属5%折扣

// 为BACS支付网关添加5%折扣
add_action( 'woocommerce_cart_calculate_fees', 'bacs_payment_5_percent_discount', 10, 1 );
function bacs_payment_5_percent_discount( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    $chosen_payment_method = WC()->session->get('chosen_payment_method');

    if ( 'bacs' === $chosen_payment_method ) {
        $discount_amount = $cart->subtotal * 0.05;
        $cart->add_fee( 'BACS支付折扣(5%)', -$discount_amount, true );
    }
}

// 支付方式变更时自动刷新购物车
add_action( 'woocommerce_review_order_before_payment', 'refresh_cart_on_payment_method_change' );
function refresh_cart_on_payment_method_change() {
    ?>
    <script type="text/javascript">
        (function($){
            $('form.checkout').on('change', 'input[name="payment_method"]', function(){
                $('body').trigger('update_checkout');
            });
        })(jQuery);
    </script>
    <?php
}

2. 调整免运费判断依据为折扣后金额

// 修改免运费规则的判断基准为BACS折扣后的小计
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'adjust_free_shipping_based_on_discounted_total', 20, 3 );
function adjust_free_shipping_based_on_discounted_total( $is_available, $package, $shipping_method ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return $is_available;

    // 仅对免运费规则生效
    if ( 'free_shipping' !== $shipping_method->id ) return $is_available;

    $chosen_payment_method = WC()->session->get('chosen_payment_method');

    // 选择BACS时用折扣后金额判断免运费
    if ( 'bacs' === $chosen_payment_method ) {
        $discounted_subtotal = WC()->cart->subtotal * 0.95;
        $is_available = $discounted_subtotal >= 250;
    }

    return $is_available;
}

代码说明

  • 第一部分代码会在用户选择BACS支付时,自动计算购物车原始小计的5%作为折扣,并在购物车/结算页显示;同时监听支付方式切换事件,实时刷新页面更新折扣状态。
  • 第二部分代码会拦截WooCommerce的免运费规则判断,当用户选择BACS支付时,用折扣后的金额(原始小计×95%)替代原始小计来判断是否满足满250美元免运费的条件,其他支付方式则保持原有规则不变。

注意事项

  • 把代码添加到子主题的functions.php文件,或者使用代码片段插件(如Code Snippets),不要直接修改主题核心文件,避免更新主题时丢失代码。
  • 确保你在WooCommerce后台设置的免运费规则是“购物车小计(不含运费)超过250美元”,代码会自动适配这个规则的判断逻辑。
  • 如果你的店铺有多个免运费规则,需要根据规则ID调整代码中的判断条件(可以在后台查看免运费规则的ID,替换代码中的相关判断)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:10:34