WooCommerce:基于指定配送方式自动完成已支付订单的实现方案
实现WooCommerce按指定配送方式自动完成订单
完全可以实现这个需求!你提供的官方代码是自动完成所有订单,而我们需要仅针对选择指定配送方式且已完成支付的订单自动标记为完成状态,同时排除银行转账、货到付款这类未即时支付的订单类型。
定制化代码片段
下面是经过验证的可行方案(感谢LoicTheAztec的思路):
add_action( 'woocommerce_thankyou', 'wc_auto_complete_paid_order_based_on_shipping_method', 20, 1 ); function wc_auto_complete_paid_order_based_on_shipping_method( $order_id ) { if ( ! $order_id ) return; // 替换为你需要触发自动完成的配送方式ID(自行打印的配送方式ID) $allowed_shipping_methods = array( '5' ); // 获取当前订单的WC_Order对象实例 $order = wc_get_order( $order_id ); // 提取订单中的配送方式数据 $shipping_item = $order->get_items('shipping'); $item = reset($shipping_item); $item_data = $item->get_data(); $method_rate_id = $item_data['instance_id']; // 获取配送方式的实例ID // 排除未即时支付的订单类型,避免自动完成未付款订单 $avoided_payment_methods = array( 'bacs', 'cod', 'cheque'); if ( in_array( $order->get_payment_method(), $avoided_payment_methods ) ){ return; } // 对符合条件的订单(已支付+指定配送方式)更新状态为「已完成」 elseif ( in_array( $method_rate_id, $allowed_shipping_methods ) ){ $order->update_status( 'completed' ); } }
关键细节说明
- 获取配送方式ID:你需要把代码里的
'5'替换为你自己的「自行打印」配送方式ID。可以在WooCommerce后台的「配送」设置中,编辑对应配送方式后,从浏览器地址栏的instance_id参数获取这个ID(比如地址栏类似wp-admin/admin.php?page=wc-settings&tab=shipping&instance_id=5§ion=flat_rate,这里的5就是ID)。 - 排除未支付订单:代码中排除了银行转账(
bacs)、货到付款(cod)、支票支付(cheque)这几种支付方式,因为这类订单需要用户实际完成支付后才应该标记完成,避免提前自动完成未付款的订单。 - 钩子优先级设置:我们把
woocommerce_thankyou钩子的优先级设为20,确保在WooCommerce默认的订单处理逻辑之后执行,避免出现逻辑冲突。
使用步骤
- 将这段代码添加到你的WordPress主题的
functions.php文件中,或者使用专门的自定义代码插件(比如Code Snippets)来添加,这样不会因为主题更新丢失代码。 - 替换代码中的配送方式ID为你实际的「自行打印」配送方式ID。
- 测试验证:选择「自行打印」配送方式和即时支付方式(如信用卡、PayPal)提交订单,之后检查订单状态是否自动变为「已完成」。
内容的提问来源于stack exchange,提问作者Tob S
相关产品推荐
相关产品推荐

