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

如何在WooCommerce中按小计+运费计算费用且不计入订单总金额

适配后完整实现代码

// 在订单备注前添加自定义复选框
add_action( 'woocommerce_before_order_notes', 'add_shipping_deposit_checkout_checkbox', 20 );
function add_shipping_deposit_checkout_checkbox(){
    // 自定义复选框字段
    woocommerce_form_field( 'shipping_deposit', array(
        'type'  => 'checkbox',
        'label' => __('15% 货运押金'),
        'class' => array( 'form-row-wide' ),
    ), '' );
}

// jQuery Ajax 交互脚本
add_action( 'wp_footer', 'checkout_deposit_script' );
function checkout_deposit_script() {
    // 仅在结账页生效
    if( is_checkout() && ! is_wc_endpoint_url() ) :

    if( WC()->session->__isset('enable_deposit') )
        WC()->session->__unset('enable_deposit')
    ?>
    <script type="text/javascript">
    jQuery( function($){
        if (typeof wc_checkout_params === 'undefined') 
            return false;

        $('form.checkout').on('change', 'input[name=shipping_deposit]', function(e){
            var deposit_enabled = $(this).prop('checked') === true ? '1' : '';

            $.ajax({
                type: 'POST',
                url: wc_checkout_params.ajax_url,
                data: {
                    'action': 'enable_deposit',
                    'enable_deposit': deposit_enabled,
                },
                success: function (result) {
                    $('body').trigger('update_checkout');
                },
            });
        });
    });
    </script>
    <?php
    endif;
}

// 处理Ajax请求,将勾选状态存入WC会话
add_action( 'wp_ajax_enable_deposit', 'save_deposit_status' );
add_action( 'wp_ajax_nopriv_enable_deposit', 'save_deposit_status' );
function save_deposit_status() {
    if ( isset($_POST['enable_deposit']) ) {
        WC()->session->set('enable_deposit', ($_POST['enable_deposit'] ? true : false) );
    }
    die();
}

// 在结账金额列表插入押金展示项(不计入订单总金额)
add_action( 'woocommerce_review_order_before_order_total', 'display_shipping_deposit', 20 );
function display_shipping_deposit() {
    // 仅在勾选押金选项时展示
    if( ! WC()->session->get('enable_deposit') ) return;
    
    $cart = WC()->cart;
    $percent = 15;
    // 计算基数:商品小计 + 运费
    $base_amount = $cart->get_subtotal() + $cart->get_shipping_total();
    $deposit_amount = $base_amount * $percent / 100;
    ?>
    <tr class="shipping-deposit">
        <th><?php _e( '货运押金', 'woocommerce' ) . " ({$percent}%)"; ?></th>
        <td data-title="<?php esc_attr_e( '货运押金', 'woocommerce' ); ?>"><?php echo wc_price( $deposit_amount ); ?></td>
    </tr>
    <?php
}

代码说明

  • 原有add_fee逻辑已完全移除,押金仅作为展示项插入结账金额列表,不会计入订单总金额,不影响实际应付金额计算
  • 押金计算基数已调整为商品小计加运费的总和,可自行修改代码中$percent = 15调整押金比例
  • 复选框交互逻辑与原逻辑一致,勾选后自动刷新金额列表展示押金,取消勾选则隐藏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:18:03