注文ステータスが「処理中」の場合にのみ、支払いを受け取った後に完了した注文ステータスを自動的に変更する必要があります。どんな場合でも注文ステータスを完了させるスニペットが見つかりましたが、支払いが正常に変更された後の支払いプラグインはデータを返し、「処理中」の注文ステータスを変更します。成功後に「完了」に変更し、ステータスが「処理中」でない場合は変更しないでください。私が出会った主な問題は、受信したステータスの順序を取得する方法がわからないことです。
ここに私のコードがあります:
add_filter( 'woocommerce_thankyou', 'update_order_status', 10, 2 );
function update_order_status( $order_id ) {
$order = new WC_Order( $order_id );
$order_status = $order->get_status();
if ('processing' == $order_status) {
$order->update_status( 'completed' );
}
//return $order_status;
}
編集:
すでにわかった。私に役立つコードは次のとおりです。
add_filter( 'woocommerce_thankyou', 'update_order_status', 10, 1 );
function update_order_status( $order_id ) {
if ( !$order_id ){
return;
}
$order = new WC_Order( $order_id );
if ( 'processing' == $order->status) {
$order->update_status( 'completed' );
}
return;
}
Update 2-2019:使用 WooCommerce:有料注文の自動完了 (更新されたスレッド)
したがって、使用する適切なフックは
woocommerce_payment_complete_order_status
フィルターが完全に戻る
更新1:WooCommerceバージョン3+との互換性+
答えを変えました
に基づいて: WooCommerce-支払済み仮想注文の自動完了(支払方法に依存) 、条件内のすべての支払方法も処理できます。
// => not a filter (an action hook)
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 = new WC_Order( $order_id );
// No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
if ( get_post_meta($order_id, '_payment_method', true) == 'bacs' || get_post_meta($order_id, '_payment_method', true) == 'cod' || get_post_meta($order_id, '_payment_method', true) == 'cheque' ) {
return;
}
// "completed" updated status for paid "processing" Orders (with all others payment methods)
elseif ( $order->has_status( 'processing' ) ) {
$order->update_status( 'completed' );
}
else {
return;
}
}
関数woocommerce_thankyou
はアクションです。フックするには、add_action
関数を使用する必要があります。他のプラグイン/コードの変更が20
の前に適用されるように、優先度をupdate_order_status
に変更することをお勧めします。
add_action( 'woocommerce_thankyou', 'update_order_status', 20);