在WooCommerce中,任何通过BACS(直接银行转账)下的订单都设置为 "on-hold"

如何将其自动更改为处理?

我不想在内使用functions.php

我有以下代码,但不起作用:

add_filter( 'woocommerce_payment_complete_order_status', 'rfvc_update_order_status', 10, 2 );

function rfvc_update_order_status( $order_status, $order_id ) {
    $order = new WC_Order( $order_id );
    if ( 'on-hold' == $order_status && 'on-hold' == $order->status ) {
        return 'processing';
    }
    return $order_status;
}

任何帮助将是巨大的!

最佳答案

2020年新更新
WooCommerce 3.4版引入了比woocommerce_thankyouwoocommerce_thankyou_bacs更好的钩子(Hook),该钩子(Hook)可以更改BACS付款方式的默认订单状态。
使用此钩子(Hook)将:

  • 明显减轻了必要的代码
  • 避免在下BACS订单时向客户发出“保留”通知。

  • 因此,请改用以下内容:
    add_filter( 'woocommerce_bacs_process_payment_order_status','filter_bacs_process_payment_order_status_callback', 10, 2 );
    function filter_bacs_process_payment_order_status_callback( $status, $order ) {
        return 'processing';
    }
    
    代码进入事件子主题(或事件主题)的functions.php文件中。经过测试和工作。

    原始答案:

    似乎woocommerce_payment_complete_order_status操作 Hook 不会通过BACS付款方式触发。
    基于this thread'woocommerce_thankyou' Action 钩子(Hook)完成了这项工作:
    add_action( 'woocommerce_thankyou', 'bacs_order_payment_processing_order_status', 10, 1 );
    
    function bacs_order_payment_processing_order_status( $order_id ) {
        if ( ! $order_id ) {
            return;
        }
    
        // Get an instance of the WC_Order object
        $order = new WC_Order( $order_id );
    
        if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status || 'pending' == $order->status) ) {
            $order->update_status('processing');
        } else {
            return;
        }
    }
    
    代码进入您的事件子主题(或事件主题)的function.php文件中。测试和工作。

    对于woocommerce 3及更高版本:
    在这里,我们使用类似的复合钩子(Hook) woocommerce_thankyou_{$order->get_payment_method()} :
    add_action( 'woocommerce_thankyou_bacs', 'bacs_order_payment_processing_order_status', 10, 1 );
    function bacs_order_payment_processing_order_status( $order_id ) {
        if ( ! $order_id ) {
            return;
        }
    
        // Get an instance of the WC_Order object
        $order = wc_get_order( $order_id );
    
        if ( in_array( $order->get_status(), array('on-hold', 'pending') ) ) {
            $order->update_status('processing');
        } else {
            return;
        }
    }
    
    代码进入您的事件子主题(或事件主题)的function.php文件中。测试和工作。

    关于php - WooCommerce更改订单状态BACS处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36597663/

    10-12 13:18