在 WooCommerce 商城中,标准的结算流程通常只包括商品总价、税费和运费。然而,在某些特定情况下,我们可能需要根据不同条件(如订单金额、支付方式、用户角色等)动态添加额外费用。例如:
小额订单附加费——如果订单金额低于某个数值,额外收取小额订单费用;
支付方式手续费——如果客户选择某些支付方式,如货到付款,增加额外的手续费;
快速处理费——客户可选择支付额外费用来加快订单处理速度。
本文将介绍如何在 WooCommerce 结算页面动态添加自定义费用,并确保其正确计入订单总金额。
一、使用 WooCommerce 钩子添加动态费用
WooCommerce 提供了 woocommerce_cart_calculate_fees 这个钩子,允许我们在结算时动态添加自定义费用。
1. 添加小额订单附加费
假设我们希望对订单金额低于 100 元的订单收取 5 元的附加费,我们可以使用以下代码:
function add_small_order_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
$threshold = 100; // 订单金额门槛
$fee_amount = 5; // 附加费用
if ( $cart->subtotal < $threshold ) { $cart->add_fee( '小额订单附加费', $fee_amount );
}
}
add_action( 'woocommerce_cart_calculate_fees', 'add_small_order_fee' );
代码解析:
- 先判断是否在后台执行(防止干扰管理员操作);
- 设置订单金额阈值
$threshold = 100,如果购物车金额低于 100,就额外收取 5 元; - 通过
$cart->add_fee( '小额订单附加费', $fee_amount )添加费用。
2. 根据支付方式添加手续费
有时,我们希望针对特定支付方式(如货到付款)收取额外手续费。以下代码实现了当客户选择“货到付款”(COD)时,额外收取 10 元费用:
function add_payment_method_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
// 获取当前选择的支付方式
$chosen_payment_method = WC()->session->get( 'chosen_payment_method' );
if ( $chosen_payment_method === 'cod' ) { // ‘cod’ 是货到付款的支付方式 ID
$cart->add_fee( '货到付款手续费', 10 );
}
}
add_action( 'woocommerce_cart_calculate_fees', 'add_payment_method_fee' );
代码解析:
WC()->session->get( 'chosen_payment_method' )获取用户当前选择的支付方式;- 如果用户选择的是“货到付款”(
cod),则添加 10 元的额外费用。
3. 允许客户选择加急订单服务
有时候,用户希望支付额外费用来加快订单处理速度。我们可以在结算页面提供一个复选框,用户勾选后自动增加加急订单费用。
步骤 1:在结算页面添加复选框
function add_express_shipping_checkbox() {
woocommerce_form_field( 'express_shipping', array(
'type' => 'checkbox',
'class' => array( 'form-row-wide' ),
'label' => '加急订单处理(+15元)',
));
}
add_action( 'woocommerce_review_order_before_submit', 'add_express_shipping_checkbox' );
代码解析:
woocommerce_form_field()用于创建复选框,woocommerce_review_order_before_submit钩子确保它出现在“提交订单”按钮上方。
步骤 2:保存复选框的值
function save_express_shipping_option( $order_id ) {
if ( isset( $_POST['express_shipping'] ) ) {
update_post_meta( $order_id, '_express_shipping', 'yes' );
}
}
add_action( 'woocommerce_checkout_update_order_meta', 'save_express_shipping_option' );
步骤 3:如果用户勾选了加急服务,增加费用
function add_express_shipping_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
if ( isset( $_POST['express_shipping'] ) ) {
$cart->add_fee( '加急订单服务费', 15 );
}
}
add_action( 'woocommerce_cart_calculate_fees', 'add_express_shipping_fee' );
代码解析:
- 在
woocommerce_cart_calculate_fees钩子中检查复选框是否勾选,如果是,则增加 15 元的费用。
四、在后台订单详情页面显示附加费用信息
为了让管理员能在后台看到这些附加费用,我们可以修改订单详情页面,显示客户选择的额外服务。
function display_custom_order_fee_in_admin( $order ) {
$express_shipping = get_post_meta( $order->get_id(), '_express_shipping', true );
if ( $express_shipping === 'yes' ) {
echo '
加急订单: 是
‘; } } add_action( ‘woocommerce_admin_order_data_after_billing_address’, ‘display_custom_order_fee_in_admin’ );
代码解析:
- 通过
woocommerce_admin_order_data_after_billing_address钩子,在后台订单页面的账单信息下方显示“加急订单”选项。
五、总结
通过本文的代码,你可以在 WooCommerce 结算页面动态添加自定义费用,以满足不同的业务需求:
根据订单金额动态添加附加费(低于 100 元收取小额订单附加费);
基于支付方式添加手续费(选择货到付款时额外收取 10 元);
允许用户选择加急订单服务(用户勾选后增加 15 元费用);
在 WooCommerce 后台订单详情中显示这些额外费用信息。
这不仅提升了结算流程的灵活性,还让你的 WooCommerce 商城能够更好地适应不同的定价和配送策略。
你的 WooCommerce 商城是否有类似需求?可以试试以上方法!








