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

WooCommerce中为指定支付方式实现购物车结算金额取整

所需WooCommerce核心钩子

你写的直接修改$cart_subtotal的逻辑无法直接生效,原因是WooCommerce的金额计算链路包含前端动态刷新、后端订单落库两个环节,直接改小计变量会破坏商品金额、运费、税费的对账逻辑,还会出现前端显示和实际订单金额不一致的问题,需要借助官方钩子覆盖全链路:

  • woocommerce_cart_calculate_fees:WooCommerce计算购物车总金额的官方钩子,支持在不修改原有商品、运费、折扣、税费计算结果的前提下,通过增减费用项调整最终总价,兼容前端AJAX刷新场景
  • 配合前端JS触发结账页刷新事件,保证用户切换支付方式时金额实时同步
可直接复用的实现代码

将以下代码放入当前主题的functions.php文件,或者自定义功能插件中即可生效:

<?php
// 货到付款时自动取整订单总价
add_action('woocommerce_cart_calculate_fees', 'cod_order_total_round', 10, 1);
function cod_order_total_round($cart) {
    // 后台非AJAX场景直接跳过,避免影响后台订单编辑
    if (is_admin() && !defined('DOING_AJAX')) return;

    // 从WC会话读取用户当前选中的支付方式
    $selected_payment = WC()->session->get('chosen_payment_method');
    // 非货到付款直接终止逻辑,完全不干扰其他支付方式计算
    if ($selected_payment !== 'cod') return;

    // 计算叠加商品、运费、税费、折扣后的未调整总价
    $raw_total = $cart->get_cart_contents_total() 
        + $cart->get_shipping_total() 
        + $cart->get_subtotal_tax() 
        + $cart->get_shipping_tax() 
        - $cart->get_discount_total() 
        - $cart->get_discount_tax();
    
    $rounded_total = round($raw_total);
    $adjust_diff = $rounded_total - $raw_total;

    // 存在差额时添加取整调整项,避免0值产生冗余费用记录
    if (abs($adjust_diff) >= 0.01) {
        $label = $adjust_diff > 0 ? '货到付款取整减免' : '货到付款取整补额';
        // 第二个参数为调整金额,第三个参数true代表该调整额参与税费计算,可根据站点实际税费规则改为false
        $cart->add_fee($label, $adjust_diff, true);
    }
}

// 切换支付方式时强制刷新结账金额,保证实时生效
add_action('wp_footer', 'checkout_payment_change_refresh', 20);
function checkout_payment_change_refresh() {
    if (!is_checkout()) return;
    ?>
    <script>
    jQuery(function($){
        $('form.checkout').on('change', 'input[name="payment_method"]', function(){
            $(document.body).trigger('update_checkout');
        });
    });
    </script>
    <?php
}
逻辑校验说明
  • 所有调整逻辑前置判断支付方式,非COD支付方式下不会执行任何金额修改,不会影响其他支付渠道的计算
  • 采用原生费用接口调整差额,没有直接篡改商品小计、单价、运费等原生计算值,不会和优惠券、折扣、税费、运费的计算逻辑冲突,订单详情中会单独展示取整调整项,对账清晰
  • 兼容前端切换支付方式的实时刷新,用户选/取消货到付款时金额会即时更新,不会出现前端显示金额和实际支付金额不符的问题
  • 取整基数为所有费用叠加后的最终结算价,不会出现漏算运费、税费导致的金额偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:27:17