通常、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」ではない場合、スニペットコードを適用します(仮想製品に関する有料注文のステータスを「完了」に更新します)。
いくつかの助けは非常にいいでしょう。
最も正確で効果的で軽量なソリューション(WooCommerce 3以降の場合)-2019
このフィルターフックは次の場所にあります。
WC_Order
_クラス inside payment_complete()
method is すべての支払い方法で使用 when 支払いが必要チェックアウト中。WC_Order_Data_Store_CPT
_クラス inside update()
method 。ご覧のとおり、デフォルトでは許可された支払済み注文ステータスは「処理中」および「完了」です。
説明:
軽量で効果的:
フィルターフックであるため、_
woocommerce_payment_complete_order_status
_ オンライン支払いが必要な場合にのみトリガーされます(「小切手」、「bacs」、「cod」の支払い方法ではない) 。ここでは、許可された支払済み注文ステータスを変更します。したがって、支払いゲートウェイなどに条件を追加する必要はありません。
正確(複数の通知を避ける):
これが唯一の方法です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)