Ajax请求后更新购物车总额 如何触发woocommerce_calculated_total修改订单金额
实现方案
你可以按照以下3个步骤完成需求,核心逻辑是将用户选择的分期参数存入WooCommerce会话持久化,再触发结算页自动重新计算总额:
1. 新增存储分期选择的Ajax接口
新增一个独立的Ajax回调,用来接收前端传来的用户选定分期档位、对应手续费等信息,存入WooCommerce Session:
// 存储用户选择的分期信息到WC会话 add_action( 'wp_ajax_save_selected_installment', 'save_selected_installment' ); add_action( 'wp_ajax_nopriv_save_selected_installment', 'save_selected_installment' ); function save_selected_installment() { if ( ! isset($_REQUEST['installment_count']) || ! isset($_REQUEST['installment_fee']) ) { wp_send_json_error('参数缺失'); } // 做参数校验和安全过滤 $installment_count = absint($_REQUEST['installment_count']); $installment_fee = floatval($_REQUEST['installment_fee']); // 存入WC会话持久化 WC()->session->set('selected_installment_count', $installment_count); WC()->session->set('selected_installment_fee', $installment_fee); wp_send_json_success('存储成功'); }
2. 实现总额计算逻辑
直接在woocommerce_calculated_total过滤器中读取会话中存储的分期手续费,叠加到订单总金额即可:
add_filter( 'woocommerce_calculated_total', 'custom_calculated_total', 10, 2 ); function custom_calculated_total( $total, $cart ){ // 仅结算页、且用户已选择分期时生效 if ( is_checkout() && ! is_wc_endpoint_url() && WC()->session->get('selected_installment_fee') ) { $total += floatval(WC()->session->get('selected_installment_fee')); } return $total; }
如果你的手续费是按订单比例动态计算,也可以只存储分期数到会话,在这个过滤器中根据当前订单总额实时计算手续费即可。
3. 前端交互调整
用户选择分期档位后,先从你原有分期配置接口的返回结果中拿到对应档位的手续费,调用上面新增的接口存储参数,最后触发WooCommerce内置的update_checkout事件,就会自动重新计算购物车总额、刷新结算页金额区块:
// 假设你的分期选项按钮class为installment-item $('.installment-item').on('click', function() { // 从你之前的分期配置接口返回结果中取对应参数 const selectedCount = $(this).data('installment-count'); const selectedFee = $(this).data('installment-fee'); // 存储分期选择到服务端 $.ajax({ url: wc_checkout_params.ajax_url, // WooCommerce结算页默认全局变量 type: 'POST', data: { action: 'save_selected_installment', installment_count: selectedCount, installment_fee: selectedFee }, success: function() { // 触发WooCommerce结算页更新,自动执行总额计算逻辑 $(document.body).trigger('update_checkout'); } }) })
补充说明
提交订单时可以额外加校验逻辑,确认会话里的分期信息和用户提交的支付信息一致,避免数据不一致问题。
内容的提问来源于stack exchange,提问作者Fatih Toprak
相关产品推荐
相关产品推荐

