5

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;
}

どんな助けでも素晴らしいでしょう!

4

3 に答える 3

12

新しい 2020 アップデート

woocommerce_thankyouWooCommerce バージョン 3.4 では、 orよりもはるかに優れたフックが導入されましたwoocommerce_thankyou_bacs。これにより、BACS 支払い方法のデフォルトの注文ステータスを変更できます。

このフックを使用すると、次のようになります。

  • 必要なコードを明確に軽量化し、
  • 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 3+ 用のバージョンを追加)

woocommerce_payment_complete_order_statusBACS決済でアクションフックが発動しないようです。

このスレッドに基づいて、'woocommerce_thankyou'アクション フックが次のように機能します。

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+ バージョンの場合:

ここでは、同様の複合フックを使用します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 ファイルに入ります。テスト済みで動作します。

于 2016-04-13T19:56:21.300 に答える
1

コードを次のように変更してみてください。

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

ここでの重要な変更点は次のとおりです。

$order->update_status('processing', 'order_note');

必要に応じて、注文メモも追加できます。

于 2016-04-13T12:38:15.313 に答える