web-dev-qa-db-ja.com

WooCommerce:有料注文の自動完了

通常、wooCommerceは仮想製品の注文をオートコンプリートする必要があります。しかし、そうではなく、これは本当の問題であり、BUGのようなものです。

そのため、この時点で非常に役立つものを見つけることができます(しかし、実際には便利ではありません):

1)スニペットコード(wooCommerceのドキュメントにあります):

/**
 * Auto Complete all WooCommerce orders.
 */
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    $order = wc_get_order( $order_id );
    $order->update_status( 'completed' );
}

ただし、このスニペットはBACS *Pay on deliveryおよびChequeの支払い方法では機能しません。 Paypalおよびクレジットカードゲートウェイの支払い方法では問題ありません。

* BACSは、直接銀行振込の支払方法です

そして…

2)プラグイン: WooCommerce Autocomplete Orders

このプラグインは、すべての支払い方法で機能します。ただし機能しませんその他クレジットカードゲートウェイの支払い方法

私の質問:

ポイント1でwooCommerceスニペットを(ベースとして)使用します。

woocommerce支払い方法に基づいて条件付きコードを実装するにはどうすればよいですか?

支払い方法が「BACS」、「Pay on delivery」、「Cheque」ではない場合、スニペットコードを適用します(仮想製品に関する有料注文のステータスを「完了」に更新します)。

いくつかの助けは非常にいいでしょう。

27
LoicTheAztec

最も正確で効果的で軽量なソリューション(WooCommerce 3以降の場合)-2019

このフィルターフックは次の場所にあります。

ご覧のとおり、デフォルトでは許可された支払済み注文ステータスは「処理中」および「完了」です。

説明:

  1. 軽量で効果的:

    フィルターフックであるため、_woocommerce_payment_complete_order_status_ オンライン支払いが必要な場合にのみトリガーされます(「小切手」、「bacs」、「cod」の支払い方法ではない) 。ここでは、許可された支払済み注文ステータスを変更します。

    したがって、支払いゲートウェイなどに条件を追加する必要はありません。

  2. 正確(複数の通知を避ける)

    これが唯一の方法です2つの異なる顧客通知を同時に送信しないようにする
    •注文ステータスの「処理中」用
    •そして、「完了」注文ステータス用です。

    つまり、顧客は注文ステータスが「完了」したときに1回だけ通知されます。

以下のコードを使用すると、支払済み注文のステータスを変更(支払済み注文の支払ゲートウェイによって設定されます)が「完了」になります。

_add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
    return 'completed';
}
_

アクティブな子テーマ(またはアクティブなテーマ)のfunction.phpファイルにコードが入ります。

関連:WooCommerce:配送方法に基づいて支払い済みの注文をオートコンプリートする


2018-改良版(WooCommerce 3以降の場合)

Woocommerceの公式フックに基づいて、この問題の解決策を見つけました*(WC 3+で動作します)。

Woocommerceでは、bacs(Bank Wire)chequeおよびcod(Cash納品時)支払済注文ステータスは「処理中」および「完了」

そのため、Paypalやクレジットカード決済などのすべての支払いゲートウェイの注文ステータスを「処理中」に設定し、注文ステータスを更新して完了します。

コード:

_add_action( 'woocommerce_thankyou', 'wc_auto_complete_paid_order', 20, 1 );
function wc_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id )
        return;

    // Get an instance of the WC_Product object
    $order = wc_get_order( $order_id );

    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
    if ( in_array( $order->get_payment_method(), array( 'bacs', 'cod', 'cheque', '' ) ) ) {
        return;
    } 
    // For paid Orders with all others payment methods (paid order status "processing")
    elseif( $order->has_status('processing') ) {
        $order->update_status( 'completed' );
    }
}
_

アクティブな子テーマ(またはアクティブなテーマ)のfunction.phpファイルにコードが入ります。


元の回答(すべてのwoocommerceバージョンの場合)

コード:

_/**
 * AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
 */
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
function custom_woocommerce_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id )
    return;

    $order = wc_get_order( $order_id );

    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
    if ( ( 'bacs' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cod' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cheque' == get_post_meta($order_id, '_payment_method', true) ) ) {
        return;
    } 
    // For paid Orders with all others payment methods (with paid status "processing")
    elseif( $order->get_status()  === 'processing' ) {
        $order->update_status( 'completed' );
    }
}
_

アクティブな子テーマ(またはアクティブなテーマ)のfunction.phpファイルにコードが入ります。

この投稿の助けを借りて: WooCommerce注文の支払い方法をIDで確認する方法

これで: helgatheviking からのget_post_meta( $order_id, '_payment_method', true );

銀行振込、代金引換、小切手による支払い方法は無視され、元の注文ステータスが維持されます。

WC 3.0+との互換性のためにコードを更新(2017-06-10)

32
LoicTheAztec