如何在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
相关产品推荐
相关产品推荐

