You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:16:28