如何按多個訂單狀態過濾 WooCommerce 訂單?

已發表: 2019-02-16

我們的一位客戶最近在管理員中為他們的 WooCommerce 訂單頁面向我們提出了這個問題:有沒有辦法在訂單後端選擇多個狀態?

雖然 WooCommerce 店主可能不需要定期這樣做,但這肯定會對他們中的一些人有所幫助。

這篇文章將解釋如何在一個視圖中顯示具有不同狀態的 WooCommerce 訂單。 在這篇文章的後半部分,我們還將檢查在顯示所有訂單時如何排除一個或多個狀態。

WooCommerce 的默認行為是您可以查看所有訂單或任何一種狀態的訂單。 但是您不能同時查看不同狀態的訂單,例如待處理和已退款訂單。 或者您不能在全部視圖中排除某個狀態的訂單。

WooCommerce Orders in Admin
默認 WooCommerce 訂單頁面視圖

除了默認的訂單狀態外,我還添加了一個自定義訂單狀態:已交付。 這已使用自定義訂單狀態插件添加並添加以驗證過濾是否也適用於自定義訂單狀態以及默認狀態。

第 1 部分:過濾 WooCommerce 訂單以在一個視圖中顯示多個狀態的訂單

有多種方法可以為此尋找解決方案。 它可以通過插件,也可以通過添加帶有代碼片段的訂單狀態的多選下拉菜單。 或者粗暴的方式,只是在 URL 中添加你想要的狀態。

這絕對不是最好的方法,但它確實有效。 我可能稍後會回來查看這篇文章並更新它以包含 WooCommerce 訂單狀態的多選下拉列表。

我們先來看代碼。

 /**
 * 處理過濾器以包含其他 woocommerce 狀態
 *
 * @param array $query_vars 查詢變量。
 * @return 數組
 */
功能 ts_woocommerce_include_order_status( $query_vars ) {
  全球 $typenow;

  /**
   * 使用 wc_get_order_types() 而不是 'shop_order' 因為其他訂單類型可以由其他插件添加
   */
  if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ), true ) ) {
    if ( isset( $_GET['include_status'] ) && '' != $_GET['include_status']
       && isset( $query_vars['post_status'] ) ) {
      $include_status = explode(',', $_GET['include_status'] );
      $q_post_status[] = $query_vars['post_status'];
      $query_vars['post_status'] = array_merge($q_post_status, $include_status);
    }
  }
  返回 $query_vars;
}
add_filter('request', 'ts_woocommerce_include_order_status', 20, 1);

我們在上面的代碼片段中做了一些事情。

首先,我們將函數附加到 WordPress 的請求過濾器上。

因為我們希望我們的代碼只為 WooCommerce 訂單頁面運行,所以我們通過確保$typenow變量存在於從 wc_get_order_types() 函數返回的數組中來做到這一點。 在這種情況下, $typenow 設置為shop_order 。 那是 WooCommerce 創建的訂單的 post_type。

include_status是 GET 變量,您應該在其中傳遞您希望顯示的其他訂單狀態。 多個訂單狀態可以通過逗號分隔。 您應該首先按您希望看到的任何 1 個訂單狀態過濾訂單。 假設您按掛單過濾。

WooCommerce Orders with Pending status
具有待處理狀態的 WooCommerce 訂單

如果您想查看已退款訂單和待處理訂單,這是不可能的。 但是,如果您在子主題的 functions.php 中添加上述代碼片段,然後在瀏覽器中將“訂單”頁面的 URL 更改為以下鏈接:

<your_store_url>/wp-admin/edit.php?post_status=wc-pending&post_type=shop_order&include_status=wc-refunded

您將看到待處理和已退款的訂單將顯示出來。

WooCommerce orders with status as Pending & Refunded being shown
顯示狀態為待處理和已退款的 WooCommerce 訂單

在 include_status 參數中,您還可以傳遞多個以逗號分隔的訂單狀態。 因此,如果您想查看待處理、已退款和已交付的訂單,可以通過更改 URL 來實現,如下所示:

<your_store_url>/wp-admin/edit.php?post_status=wc-pending&post_type=shop_order&include_status=wc-refunded,wc-delivered

請務必注意,已交付是我在測試 WooCommerce 安裝中添加的自定義狀態。 它的蛞蝓是 wc-delivered。 狀態是通過自定義訂單狀態插件添加的。

當您打開上述鏈接時,您將看到具有這 3 種狀態的訂單:

WooCommerce orders with status as Pending, Refunded & Delivered being shown
顯示狀態為待處理、已退款和已交付的 WooCommerce 訂單

由於 URL 編碼,URL 中的逗號被替換為 %2C。

第 2 部分:過濾 WooCommerce 訂單以在“全部”視圖中隱藏一種或多種狀態的訂單

默認情況下,您會看到一個視圖,其中所有狀態的 WooCommerce 訂單都顯示在訂單頁面上。

WooCommerce Orders in Admin

我在下面創建了允許您在 URL 中傳遞變量exclude_status的代碼片段。 在 exclude_status 變量中,您可以傳遞您希望排除在“全部”視圖的“訂單”頁面上顯示的狀態的 slug。 這是代碼:

 /**
 * 處理從所有訂單視圖中排除 woocommerce 狀態的過濾器
 *
 * @param array $query_vars 查詢變量。
 * @return 數組
 */
功能 ts_woocommerce_exclude_order_status( $query_vars ) {
  全球 $typenow;

  /**
   * 使用 wc_get_order_types() 而不是 'shop_order' 因為其他訂單類型可以由其他插件添加
   */
  if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ), true ) ) {
    if ( isset( $_GET['exclude_status'] ) && '' != $_GET['exclude_status']
       && isset( $query_vars['post_status'] ) ) {
      $exclude_status = explode(',', $_GET['exclude_status']);
      foreach ( $exclude_status as $key => $value ) {
        if ( ( ( $key = array_search( $value, $query_vars['post_status'] ) ) !== false) {
          未設置($query_vars['post_status'][$key]);
        }
      }
    }
  }
  返回 $query_vars;
}
add_filter('request', 'ts_woocommerce_exclude_order_status', 20, 1);

當上述代碼添加到您的子主題的 functions.php 文件中時,然後如果您將 WooCommerce 訂單頁面的 URL 更改為以下 URL:

<your_store_url>/wp-admin/edit.php?post_type=shop_order&exclude_status=wc-pending

那麼處於Pending狀態的訂單將不會顯示在所有訂單的默認視圖中:

Excludes Pending orders from being displayed from all orders view
從所有訂單視圖中排除待處理訂單

您還可以指定要排除的多個訂單狀態。 它們需要用逗號分隔。 擴展上面的示例,如果您想從所有視圖中隱藏待處理和已交付的訂單,那麼您可以將您的訂單頁面 URL 更改為:

<your_store_url>/woocommerce/wp-admin/edit.php?post_type=shop_order&exclude_status=wc-pending,wc-delivered

訂單頁面將不再在所有視圖中顯示待處理和已交付訂單:

Excludes Pending & Delivered orders from being displayed from all orders view
從所有訂單視圖中排除待處理和已交付訂單

這是默認 WooCommerce 訂單狀態及其各自 slug 的參考。

  • 待付款 – wc-pending
  • 失敗 - wc-失敗
  • 處理 - wc-處理
  • 已完成 - wc-完成
  • 暫停 - wc-on-hold
  • 已取消 - wc-已取消
  • 已退款 - wc-refunded

直接在 URL 中添加訂單狀態並不是最好的方法。 但是這篇文章的想法是展示如何實現目標。

您是否嘗試過任何其他方法在 WooCommerce 中按訂單狀態過濾訂單? 我很想認識他們。