如何在结账页(checkout page)及下单环节保存自定义费用(custom fee)并同步订单总价
WooCommerce结账页自定义费用下单后金额不同步修复方案
问题根因
- 自定义费用仅在前端结账页渲染,没有绑定WooCommerce全局订单计算钩子,下单时会话数据丢失,费用未写入订单数据库记录
- 仅挂载了
woocommerce_cart_calculate_fees钩子,没有同步绑定订单创建的钩子逻辑
修复步骤
- 全局挂载自定义费用计算逻辑
将自定义费用的计算逻辑绑定到通用的购物车/订单计算钩子,确保全流程费用计算一致:
add_action( 'woocommerce_cart_calculate_fees', 'add_custom_fee_globally' ); function add_custom_fee_globally( $cart ) { // 跳过后台非AJAX请求避免干扰 if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; } // 替换为你实际的费用计算规则 $custom_fee_amount = 15.00; $cart->add_fee( '附加服务费', $custom_fee_amount, false ); }
- 同步写入自定义费用到订单数据
下单创建订单时,将购物车内的自定义费用同步写入订单记录,确保后续订单页读取数据正确:
add_action( 'woocommerce_checkout_create_order', 'sync_custom_fee_to_order', 10, 2 ); function sync_custom_fee_to_order( $order, $checkout_data ) { // 遍历购物车费用找到对应的自定义费用 foreach ( WC()->cart->get_fees() as $fee_item ) { if ( $fee_item->name == '附加服务费' ) { $order->add_fee( $fee_item->name, $fee_item->amount, $fee_item->taxable, $fee_item->tax_class ); break; } } // 重新计算订单总金额确保数值正确 $order->calculate_totals(); }
- 验证修复效果
代码部署后按以下步骤验证:
- 清空网站缓存、浏览器缓存、WooCommerce购物车会话
- 重新添加商品到购物车进入结账页,确认自定义费用显示正常
- 走完全部下单流程,查看订单详情页总金额是否和结账页一致
- 如果站点配置了缓存插件/CDN,需要将购物车、结账、订单页面添加到缓存排除列表,避免缓存导致的数据异常
内容的提问来源于stack exchange,提问作者John Bastian Dinglasan
相关产品推荐
相关产品推荐

