Как фильтровать заказы WooCommerce по нескольким статусам заказа?

Опубликовано: 2019-02-16

Один из наших клиентов недавно задал нам этот вопрос для своей страницы заказов WooCommerce в админке: есть ли способ выбрать несколько статусов в бэкенде заказа?

Хотя владельцам магазинов WooCommerce, возможно, не нужно делать это на регулярной основе, но это определенно поможет некоторым из них.

В этом посте объясняется, как отображать заказы WooCommerce с разными статусами в одном представлении. Во второй половине этого поста мы также проверим, как исключить один или несколько статусов при отображении всех заказов.

Поведение WooCommerce по умолчанию заключается в том, что вы можете просматривать все заказы или заказы для любого одного статуса . Но вы не можете просматривать заказы с разными статусами вместе, например заказы в ожидании и возвращенные. Или вы не можете исключить заказы со статусом в представлении «Все».

WooCommerce Orders in Admin
Вид страницы заказов WooCommerce по умолчанию

Помимо статусов заказа по умолчанию, я добавил пользовательский статус заказа: Доставлено. Это было добавлено с помощью плагина Custom Order Status и добавлено для проверки того, что фильтрация также будет работать с пользовательскими статусами заказов наряду со статусами по умолчанию.

Часть 1. Фильтрация заказов WooCommerce для отображения заказов с несколькими статусами в одном представлении

Есть несколько способов найти решение для этого. Это может быть либо через плагин, либо путем добавления раскрывающегося списка с несколькими вариантами статуса заказа с фрагментом кода. Или грубый способ, просто добавьте нужный статус в URL-адрес.

Это определенно не лучший способ, но он работает. Возможно, я вернусь к этому сообщению позже и обновлю его, включив в него раскрывающийся список с несколькими вариантами статусов заказов WooCommerce.

Давайте сначала посмотрим на код.

 /**
 * Обрабатывать фильтры для включения дополнительных статусов woocommerce
 *
 * Массив @param $query_vars Переменные запроса.
 * @возвратный массив
 */
функция ts_woocommerce_include_order_status ($query_vars) {
  глобальный $typenow;

  /**
   * Использование wc_get_order_types() вместо 'shop_order', так как другие типы ордеров могут быть добавлены другими плагинами
   */
  if (in_array($typenow, wc_get_order_types('мета-боксы порядка'), true)) {
    если ( isset( $_GET['include_status'] ) && '' != $_GET['include_status']
       && isset($query_vars['post_status'] )) {
      $include_status = взорвать( ',', $_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('запрос', 'ts_woocommerce_include_order_status', 20, 1);

Мы делаем несколько вещей в приведенном выше фрагменте.

Во-первых, мы присоединяем нашу функцию к фильтру запросов WordPress.

Поскольку мы хотим, чтобы наш код выполнялся только для страницы заказов WooCommerce, мы делаем это, убедившись, что переменная $typenow присутствует в массиве, возвращаемом функцией wc_get_order_types(). В этом случае для $typenow установлено значение shop_order . Это post_type заказов, созданных WooCommerce.

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. Его пуля доставлена ​​в туалет. Статус добавляется с помощью плагина Custom Order Status.

Когда вы откроете ссылку выше, вы увидите заказы с этими 3 статусами:

WooCommerce orders with status as Pending, Refunded & Delivered being shown
Отображаются заказы WooCommerce со статусом «Ожидание», «Возвращено» и «Доставлено»

Запятая в URL-адресе заменяется на %2C из-за кодировки URL-адреса.

Часть 2. Отфильтруйте заказы WooCommerce, чтобы скрыть заказы с одним или несколькими статусами в представлении «Все».

По умолчанию вам предоставляется представление, в котором заказы WooCommerce всех статусов отображаются на странице «Заказы».

WooCommerce Orders in Admin

Ниже я создал фрагмент кода, который позволяет вам передать переменную в URL-адресе exclude_status . В переменной exclude_status вы можете передать слаг статуса, который вы хотите исключить из отображения на странице «Заказы» в представлении «Все». Вот код:

 /**
 * Обрабатывать фильтры для исключения статусов woocommerce из просмотра всех заказов.
 *
 * Массив @param $query_vars Переменные запроса.
 * @возвратный массив
 */
функция ts_woocommerce_exclude_order_status ($query_vars) {
  глобальный $typenow;

  /**
   * Использование wc_get_order_types() вместо 'shop_order', так как другие типы ордеров могут быть добавлены другими плагинами
   */
  if (in_array($typenow, wc_get_order_types('мета-боксы порядка'), true)) {
    если ( isset( $_GET['exclude_status'] ) && '' != $_GET['exclude_status']
       && isset($query_vars['post_status'] )) {
      $exclude_status = взорвать( ',', $_GET['exclude_status'] );
      foreach ($exclude_status as $key => $value) {
        if ( ( $key = array_search( $value, $query_vars['post_status'] )) !== false) {
          unset($query_vars['post_status'][$key]);
        }
      }
    }
  }
  вернуть $query_vars;
}
add_filter('запрос', 'ts_woocommerce_exclude_order_status', 20, 1);

Когда приведенный выше код добавляется в файл functions.php вашей дочерней темы, а затем, если вы измените URL-адрес своей страницы заказов WooCommerce на приведенный ниже:

<your_store_url>/wp-admin/edit.php?post_type=shop_order&exclude_status=wc-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-ожидание,wc-доставлено

На странице «Заказы» больше не будут отображаться ожидающие и доставленные заказы в представлении «Все»:

Excludes Pending & Delivered orders from being displayed from all orders view
Исключает ожидающие и доставленные заказы из отображения всех заказов

Вот ссылка на статусы заказов WooCommerce по умолчанию и их соответствующие слаги.

  • Ожидающий платеж – wc-ожидающий
  • Не удалось — wc-не удалось
  • Обработка — wc-обработка
  • Завершено – wc-завершено
  • На удержании – туалет на удержании
  • Отменено – wc-отменено
  • Возврат – wc-возврат

Добавление статусов заказа напрямую в URL — не лучший подход. Но идея этого поста в том, чтобы показать, как можно достичь цели.

Вы пробовали какой-либо другой подход для фильтрации заказов по статусам заказов в WooCommerce? Я хотел бы знать их.