WooCommerce の注文が Processing ステータスになったときに自動的に注文を完了する方法

公開: 2019-04-06

すべての e コマース サイトには、注文の追跡と管理が必要です。これは、平均的な高トラフィックの e コマース Web サイトが 1 日に受け取る注文の数を考えると、管理者にとって非常に困難な作業になる可能性があります。 WooCommerce に関しては、チェックアウト プロセスが完了するとすぐに注文が作成されます (以下の WooCommerce 注文ステータス フローを確認してください)。

注文が支払いから配送までのチェーンのどこにあるかに応じて、ステータスが割り当てられます。 これらのステータスは、注文がどこにあるかに応じて、WooCommerce、支払いゲートウェイ、およびストア所有者/管理者によって設定および/または変更されます。

WooCommerce での注文の流れを見る前に、初心者のために Woocommerce での注文ステータスを定義しましょう。

WooCommerce の注文ステータスとは?

注文ステータスは、顧客による注文の現在の状態を表したものです。 Woocommerce の注文ステータスは、注文が配送段階まで処理されるか、または製品/サービスに問題があり、ストア所有者が顧客に返金することに同意した場合に返金されます。 たとえば、顧客が特定の製品を注文すると、すぐに一連の次の注文ステータス、つまり「支払い保留」が設定されます。 保留中の支払いは、デフォルトで Woocommerce に設定されています。

それでは、理解を深めるためにフローチャートを見てみましょう。

Woocommerce 注文ステータス フローチャート

Woocommerce Order Status Flow Chart
ソース: https://docs.woocommerce.com/document/managing-orders/

図に示すように、注文の支払いが正常に完了した後、店舗の所有者が手動で「完了」に変更するまで、そのステータスは「処理中」に設定されます。 これは、特に販売量が多い場合に、店舗の所有者または管理者にとって間接的な作業です。 このプロセスを効率化する 1 つの方法は、WooCommerce の注文が処理中のステータスになったときに自動的に完了することです。 コード スニペットを使用してそれを行う方法を見てみましょう。

WooCommerce の注文ステータスの完全なリスト

  • 保留中の支払い:これは、注文が行われたが支払いが行われていない場合にデフォルトで表示されます。
  • 失敗:これは、支払いが完了せず、拒否されたことを示します。
  • 処理中:これは、支払いが完了し、ストア オーナーが受け取ったことを示します。現在、発送と配送の処理が可能です。
  • 完了:これは、すべてが順調に進み、注文が履行されて完了したことを示します。
  • 保留中: これは、注文が店主からの確認を必要とする状態を示します。
  • キャンセル済み: 注文ステータスが「キャンセル済み」の場合、これ以上のアクションは必要ありません。 キャンセルは、ある時点で管理者または顧客からのものである可能性があります。
  • 返金済み:注文は返金されました。これ以上のアクションは必要ありません

注文ステータスとその機能について理解を深めたところで、次に、注文ステータスを更新することをお勧めする理由を見てみましょう。

お支払い方法に基づいて WooCommerce の注文ステータスを自動的に完了として設定します

ほとんどの場合、支払いが正常に行われた後にのみこれを行う必要があります。これは、ユーザーが代金引換オプションを選択していない場合にのみ可能です。 以下のコードを子テーマの functions.php ファイルに挿入すると、支払いが正常に行われるたびに注文のステータスが自動的にCompletedに設定されます。 したがって、ユーザーが代金引換オプションを選択した場合を除き、すべての場合において、注文ステータスは自動的に完了に変更されます。

 add_action('woocommerce_order_status_changed', 'ts_auto_complete_by_payment_method');

関数 ts_auto_complete_by_payment_method($order_id)
{
  
  if ( ! $order_id ) {
        戻る;
  }

  グローバル $product;
  $order = wc_get_order( $order_id );
  
  if ($order->data['status'] == '処理中') {
        $payment_method=$order->get_payment_method();
        if ($payment_method!="cod")
        {
            $order->update_status( '完了' );
        }
      
  }
  
}

ここでは、 woocommerce_order_status_changedフックを使用して、注文のステータスが変更されたときに関数を呼び出します。 注文のステータスが処理中かどうかを確認した後、支払い方法が代金引換でない場合のみ、注文ステータスが完了に変更されます。 WooCommerce には 4 つのデフォルトの支払い方法があります。 直接銀行振込 (bacs)、小切手支払い (cheque)、代金引換 (cod)、PayPal (paypal)。 条件を指定する支払い方法に応じて、「bacs」、「cheque」、「cod」、「paypal」などの適切なIDを使用する必要があります。

仮想製品の WooCommerce 注文ステータスを [完了] に自動的に設定する

注文ステータスを自動的に完了する必要があるもう 1 つのケースは、注文内の製品が仮想製品である場合です。 仮想製品は、具体的ではない、またはダウンロード可能な製品です。 この例としては、ストア メンバーシップのサブスクリプションや、サブスクリプションを購入した人に割引を提供するクーポンがあります。

automatically Complete WooCommerce orders when they go to the Processing status - Virtual Product Example - Store Membership
仮想製品の例

ストア メンバーシップのサブスクリプションには具体的な形式がなく、代わりに有効期限がある場合があります。 ソフトウェアや電子映画チケットなどのダウンロード可能な製品も、オフラインの存在や形式を持たないため、仮想製品です。 ほとんどの仮想製品には、「代金引換」のオプションはありません。 支払いはその場で行われるため、使用された支払い方法を確認する条件を含めなくても安全です。代わりに、注文のすべての商品が仮想商品であるかどうかを確認する条件のみを追加します。

 add_action('woocommerce_order_status_changed', 'ts_auto_complete_virtual');

関数 ts_auto_complete_virtual($order_id)
{
  
  if ( ! $order_id ) {
        戻る;
  }
  
  グローバル $product;
  $order = wc_get_order( $order_id );
  
  if ($order->data['status'] == '処理中') {
    
    $virtual_order = null;

    if ( count( $order->get_items() ) > 0 ) {

      foreach( $order->get_items() as $item ) {

        if ( 'line_item' == $item['type'] ) {

          $_product = $order->get_product_from_item( $item );

          if ( ! $_product->is_virtual() ) {
            // 非仮想製品が 1 つ見つかったら、ループから抜け出します
            $virtual_order = false;
            壊す;
          } 
          そうしないと {
            $virtual_order = true;
          }
       }
     }
   }

    // すべてが仮想製品の場合、完了としてマークします
    if ( $virtual_order ) {
      $order->update_status( '完了' );
    }
  }	
}

ここでは、同じフックを使用して関数ts_auto_complete_virtualを呼び出します。 注文が処理中かどうかを確認した後、注文の各アイテムを調べて、それが仮想製品かどうかを確認する必要があります。

結論

典型的な Woocommerce 注文には、製品、配送、手数料など、それに関連付けられた多くの項目があります。ここで、 line_itemは製品を指します。 仮想製品かどうかを確認するために、製品のみを 1 つずつフェッチする必要があります。 仮想商品でない商品が 1 つでもある場合、注文のステータスは完了としてマークされません。

ただし、要件によっては、この投稿の最初のコード スニペットを使用して、注文ステータスを完了としてマークする条件を追加することもできます。 たとえば、非仮想製品でも (これらの製品の支払いが完了している場合) 注文ステータスを完了としてマークしたい場合は、仮想製品であるかどうかを確認した後、支払い方法にチェックを追加することで実行できます。製品。 ただし、このコード スニペットでは、注文のすべての製品が仮想製品である場合にのみ、注文のステータスが完了として設定されます。