進入處理狀態時如何自動完成 WooCommerce 訂單

已發表: 2019-04-06

每個電子商務網站都需要跟踪和管理訂單,這對於管理員來說可能是一項艱鉅的任務,考慮到一個普通的高流量電子商務網站每天收到的訂單數量。 對於 WooCommerce,一旦結帳流程完成,就會創建一個訂單(查看下面的 WooCommerce 訂單狀態流程)。

根據訂單在付款到交付鏈中的位置,它被分配一個狀態。 這些狀態由 WooCommerce、支付網關和商店所有者/管理員設置和/或更改,具體取決於訂單所在的位置。

在我們看一下 WooCommerce 中的訂單流程之前,讓我們先定義一下 WooCommerce 中的訂單狀態,以便新手受益。

WooCommerce 中的訂單狀態是什麼?

訂單狀態是客戶下訂單的當前狀態的表示。 Woocommerce 中的訂單狀態會隨著訂單被處理到交付階段而發生變化,或者在產品/服務出現問題並且店主同意向客戶退款的情況下退款。 例如,當客戶對某個產品下訂單時,會立即設置序列中的下一個訂單狀態,即“待付款”。 Woocommerce 中默認設置待付款。

現在,讓我們看一下流程圖以便更好地理解。

Woocommerce 訂單狀態流程圖

Woocommerce Order Status Flow Chart
來源:https://docs.woocommerce.com/document/managing-orders/

如圖所示,在成功完成訂單付款後,其狀態設置為“處理中”,直到店主手動將其更改為“已完成”。 這對店主或管理員來說是一項開銷任務,尤其是在銷量很高的情況下。 使此過程高效的一種方法是在 WooCommerce 訂單進入處理狀態時自動完成訂單。 讓我們看看我們如何使用代碼片段來做到這一點。

WooCommerce 中訂單狀態的完整列表

  • 待付款:下訂單但未付款時默認出現。
  • 失敗:表示支付未通過,被拒絕。
  • 處理中:這表示付款已通過並由店主收到,現在可以處理以進行運輸和交付。
  • 已完成:這表示一切順利,訂單現已完成並完成。
  • On hold : 這表示訂單需要店主確認的狀態。
  • 已取消:訂單狀態“已取消”不需要任何進一步的操作。 取消可以在某個時候來自管理員或客戶。
  • 退款:訂單已退款,無需進一步操作

現在我們更好地了解了訂單狀態及其功能,讓我們看看為什麼更新它是個好主意。

根據付款方式自動將 WooCommerce 訂單狀態設置為已完成

在大多數情況下,您需要在付款成功後執行此操作,並且只有在用戶未選擇貨到付款選項時才可能這樣做。 下面的代碼,當插入到您的子主題的functions.php 文件中時,將在付款成功時自動將訂單狀態設置為已完成。 因此,在所有情況下,除非用戶選擇貨到付款選項,否則訂單狀態將自動更改為已完成。

 add_action('woocommerce_order_status_changed', 'ts_auto_complete_by_payment_method');

函數 ts_auto_complete_by_payment_method($order_id)
{
  
  如果(!$order_id){
        返回;
  }

  全球$產品;
  $order = wc_get_order($order_id);
  
  if ($order->data['status'] == 'processing') {
        $payment_method=$order->get_payment_method();
        if ($payment_method!="cod")
        {
            $order->update_status('完成');
        }
      
  }
  
}

在這裡,您將使用woocommerce_order_status_changed掛鉤在訂單狀態更改時調用函數。 確認訂單是否處於 Processing 狀態後,只有當支付方式不是 Cash-on-Delivery 時,訂單狀態才會變為Completed 。 WooCommerce 有四種默認付款方式,即。 直接銀行轉賬 (bacs)、支票付款 (cheque)、貨到付款 (cod) 和 PayPal (paypal)。 根據您指定條件的付款方式,您需要使用適當的ID ,例如“bacs”、“cheque”、“cod”、“paypal”。

自動將 WooCommerce 訂單狀態設置為虛擬產品的已完成

您希望訂單狀態自動完成的另一種情況是訂單中的一個或多個產品是虛擬產品。 虛擬產品是無形或可下載的產品。 這方面的一個例子是商店會員訂閱或向購買訂閱的人提供折扣的優惠券。

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)
{
  
  如果(!$order_id){
        返回;
  }
  
  全球$產品;
  $order = wc_get_order($order_id);
  
  if ($order->data['status'] == 'processing') {
    
    $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() ) {
            // 一旦我們找到一個非虛擬產品,就跳出循環
            $virtual_order = 假;
            休息;
          } 
          別的 {
            $virtual_order = 真;
          }
       }
     }
   }

    // 如果都是虛擬產品,則標記為已完成
    if ( $virtual_order ) {
      $order->update_status('完成');
    }
  }	
}

在這裡,我們使用相同的鉤子來調用我們的函數ts_auto_complete_virtual 。 在檢查訂單是否處於處理狀態後,您需要查看訂單中的每個項目,看看它是否是虛擬產品。

結論

一個典型的 Woocommerce 訂單有很多與之相關的項目,例如產品、運費、費用等。這裡, line_item是指產品。 只需要一件一件的去取商品,看看是不是虛擬的。 即使有一件商品不是虛擬商品,訂單的狀態也不會被標記為已完成。

但是,根據您的要求,並使用本文中的第一個代碼段,您可以添加更多條件以將訂單狀態標記為已完成。 例如,如果您希望即使對於非虛擬產品也將訂單狀態標記為已完成(如果這些產品的付款已完成),那麼您可以通過在檢查它是否是虛擬的付款方式後添加檢查來實現產品。 但是,通過此代碼段,僅當訂單中的所有產品都是虛擬產品時,訂單的狀態才會設置為已完成