web-dev-qa-db-ja.com

WooCommerceでの支払い直後に注文ステータスを変更する

注文ステータスが「処理中」の場合にのみ、支払いを受け取った後に完了した注文ステータスを自動的に変更する必要があります。どんな場合でも注文ステータスを完了させるスニペットが見つかりましたが、支払いが正常に変更された後の支払いプラグインはデータを返し、「処理中」の注文ステータスを変更します。成功後に「完了」に変更し、ステータスが「処理中」でない場合は変更しないでください。私が出会った主な問題は、受信したステータスの順序を取得する方法がわからないことです。

ここに私のコードがあります:

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;
}
9
Borys Zielonka

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

関数woocommerce_thankyouはアクションです。フックするには、add_action関数を使用する必要があります。他のプラグイン/コードの変更が20の前に適用されるように、優先度をupdate_order_statusに変更することをお勧めします。

add_action( 'woocommerce_thankyou', 'update_order_status', 20);
4
Pranav