WooCommerce:未收款时自动修改订单状态的问题求助
WooCommerce B2B店铺:下单后自动将订单状态设为Processing的解决方案
我们运营一个基于WooCommerce的B2B店铺,仅承接订单不在线收款,订单同步至ERP系统处理后发送发票。店铺仅启用「收到发票后银行转账」支付方式,未添加其他支付网关,需要实现用户下单后订单状态自动变更为Processing,但尝试以下代码无效果:
add_action( 'woocommerce_thankyou', 'woocommerce_thankyou_change_order_status', 10, 1 ); function woocommerce_thankyou_change_order_status( $order_id ){ if( ! $order_id ) return; $order = wc_get_order( $order_id ); if( $order->get_status() == 'wc-pending' ) $order->update_status( 'wc-processing' ); }
问题根源
WooCommerce内置的「收到发票后银行转账」(Invoice Payment)支付方式,默认生成的订单状态是on-hold(待处理),而非代码中判断的pending,因此条件永远不满足,状态不会更新。
解决方案
方案一:直接修改支付方式的默认订单状态(推荐)
通过过滤器直接修改该支付方式创建订单时的默认状态,无需依赖thankyou页面钩子,逻辑更可靠:
// 将"收到发票后银行转账"支付方式的默认订单状态改为processing add_filter( 'woocommerce_invoice_payment_order_status', 'custom_invoice_payment_order_status', 10, 1 ); function custom_invoice_payment_order_status( $default_status ) { return 'processing'; }
方案二:调整原有钩子的判断逻辑
如果需要保留woocommerce_thankyou钩子,修改状态判断条件并提高钩子优先级,确保在支付方式处理完状态后执行:
add_action( 'woocommerce_thankyou', 'update_invoice_order_to_processing', 20, 1 ); function update_invoice_order_to_processing( $order_id ){ if( ! $order_id ) return; $order = wc_get_order( $order_id ); // 验证支付方式为发票支付,且当前状态为on-hold if( $order->get_payment_method() === 'invoice' && $order->get_status() === 'on-hold' ){ // 第二个参数是状态变更备注,可根据需求修改 $order->update_status( 'processing', '订单自动更新为处理中,同步至ERP系统' ); } }
注意事项
- 代码需添加到当前主题的
functions.php文件,或使用自定义代码管理插件(如Code Snippets)避免主题更新丢失 - 如果你的「收到发票后银行转账」是自定义支付方式,需将
get_payment_method()中的invoice替换为该支付方式的实际slug - 测试下单流程,确认订单状态是否正确变更为Processing
内容的提问来源于stack exchange,提问作者Wolf.Piller
相关产品推荐
相关产品推荐

