Jak filtrować zamówienia WooCommerce według wielu statusów zamówień?

Opublikowany: 2019-02-16

Jeden z naszych klientów ostatnio zadał nam to pytanie na swojej stronie Zamówienia WooCommerce w admin: Czy istnieje sposób na wybranie wielu statusów w zapleczu zamówienia?

Chociaż właściciele sklepów WooCommerce mogą nie musieć robić tego regularnie, ale na pewno pomogłoby to niektórym z nich.

Ten post wyjaśnia, jak wyświetlać zamówienia WooCommerce o różnych statusach w jednym widoku. W drugiej połowie tego wpisu sprawdzimy również, jak wykluczyć jeden lub wiele statusów, gdy wyświetlane są wszystkie zamówienia.

Domyślnym zachowaniem WooCommerce jest to, że możesz wyświetlić Wszystkie zamówienia lub zamówienia dla dowolnego statusu . Nie możesz jednak wyświetlać jednocześnie zamówień o różnych statusach, np. zamówień oczekujących i zwróconych. Lub nie można wykluczyć zamówień o statusie w widoku Wszystkie.

WooCommerce Orders in Admin
Domyślny widok strony Zamówienia WooCommerce

Oprócz domyślnych statusów zamówień dodałem niestandardowy status zamówienia: Dostarczone . Zostało to dodane za pomocą wtyczki Niestandardowy status zamówienia i jest dodawane w celu sprawdzenia, czy filtrowanie działa również z niestandardowymi statusami zamówień wraz ze statusami domyślnymi.

Część 1: Filtruj zamówienia WooCommerce, aby wyświetlać zamówienia o wielu statusach w jednym widoku

Istnieje wiele sposobów na znalezienie rozwiązania tego problemu. Może to być albo za pomocą wtyczki, albo przez dodanie listy rozwijanej statusu zamówienia z wielokrotnym wyborem z fragmentem kodu. Lub w prosty sposób, po prostu dodaj żądany status w adresie URL.

To zdecydowanie nie jest najlepszy sposób, ale działa. Może wrócę później do tego posta i zaktualizuję go, aby zawierał listę rozwijaną statusów zamówień WooCommerce.

Spójrzmy najpierw na kod.

 /**
 * Obsługa filtrów w celu uwzględnienia dodatkowych statusów woocommerce
 *
 * @param array $query_vars Zmienne zapytania.
 * @tablica powrotu
 */
funkcja ts_woocommerce_include_order_status( $query_vars ) {
  globalny $typenow;

  /**
   * Używanie wc_get_order_types() zamiast 'shop_order', ponieważ inne typy zamówień mogą być dodawane przez inne wtyczki
   */
  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 = rozbij(',', $_GET['include_status'] );
      $q_post_status[] = $query_vars['post_status'];
      $query_vars['post_status'] = array_merge( $q_post_status, $include_status );
    }
  }
  zwróć $query_vars;
}
add_filter( 'żądanie', 'ts_woocommerce_include_order_status', 20, 1 );

W powyższym fragmencie robimy kilka rzeczy.

Najpierw dołączamy naszą funkcję do filtra żądań WordPressa.

Ponieważ chcemy, aby nasz kod działał tylko dla strony Zamówienia WooCommerce, robimy to upewniając się, że zmienna $typenow jest obecna w tablicy zwracanej przez funkcję wc_get_order_types(). W tym przypadku $typenow jest ustawione na shop_order . To jest post_type zamówień tworzonych przez WooCommerce.

include_status to zmienna GET, w której należy przekazać inne statusy zamówień, które mają być wyświetlane. Wiele statusów zamówień można przekazać oddzielone przecinkami. Najpierw należy przefiltrować zamówienie według dowolnego statusu zamówienia, który chcesz zobaczyć. Załóżmy, że filtrujesz według zamówień oczekujących.

WooCommerce Orders with Pending status
Zamówienia WooCommerce ze statusem Oczekujące

Jeśli chcesz zobaczyć zamówienia zwrócone wraz z zamówieniami oczekującymi, nie jest to możliwe. Jeśli jednak dodasz powyższy fragment kodu w pliku functions.php motywu podrzędnego, a następnie zmienisz adres URL strony Zamówienia na poniższy link w przeglądarce:

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

zobaczysz, że pojawią się zamówienia oczekujące oraz zamówienia zwrócone.

WooCommerce orders with status as Pending & Refunded being shown
Wyświetlane są zamówienia WooCommerce ze statusem Oczekujące i zwrócone

W parametrze include_status można również przekazać wiele statusów zamówień oddzielonych przecinkami. Jeśli więc chcesz wyświetlić zamówienia oczekujące, zwrócone i dostarczone, możesz to zrobić, zmieniając adres URL, jak poniżej:

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

Należy zauważyć, że Delivered to niestandardowy status, który dodałem w mojej testowej instalacji WooCommerce. Ślimak jest dostarczany wc. Status jest dodawany za pomocą wtyczki Custom Order Status.

Gdy otworzysz powyższy link, zobaczysz zamówienia z tymi 3 statusami:

WooCommerce orders with status as Pending, Refunded & Delivered being shown
Wyświetlane są zamówienia WooCommerce ze statusem oczekujące, zwrócone i dostarczone

Przecinek w adresie URL zostaje zastąpiony przez %2C z powodu kodowania adresu URL.

Część 2: Filtruj zamówienia WooCommerce, aby ukryć zamówienia o jednym lub więcej statusach w widoku Wszystkie

Domyślnie wyświetlany jest widok, w którym zamówienia WooCommerce o wszystkich statusach są wyświetlane na stronie Zamówienia.

WooCommerce Orders in Admin

Stworzyłem poniżej fragment kodu, który pozwala przekazać zmienną w adresie URL, exclude_status . W zmiennej exclude_status, możesz przekazać informację o stanie, który chcesz wykluczyć z wyświetlania na stronie Zamówienia w widoku Wszystkie. Oto kod:

 /**
 * Obsługa filtrów w celu wykluczenia statusów woocommerce z widoku Wszystkie zamówienia
 *
 * @param array $query_vars Zmienne zapytania.
 * @tablica powrotu
 */
funkcja ts_woocommerce_exclude_order_status( $query_vars ) {
  globalny $typenow;

  /**
   * Używanie wc_get_order_types() zamiast 'shop_order', ponieważ inne typy zamówień mogą być dodawane przez inne wtyczki
   */
  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 jako $klucz => $wartość) {
        if ( ( $klucz = array_search( $value, $query_vars['post_status'] ) ) !== false) {
          unset( $query_vars['post_status'][$key] );
        }
      }
    }
  }
  zwróć $query_vars;
}
add_filter( 'żądanie', 'ts_woocommerce_exclude_order_status', 20, 1 );

Gdy powyższy kod zostanie dodany do pliku functions.php motywu podrzędnego, a następnie zmienisz adres URL strony Zamówienia WooCommerce na poniższy:

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

Wówczas zlecenia ze statusem Oczekujące nie będą wyświetlane w domyślnym widoku Wszystkich zleceń:

Excludes Pending orders from being displayed from all orders view
Wyłącza wyświetlanie zleceń oczekujących w widoku wszystkich zleceń

Możesz również określić wiele statusów zamówień do wykluczenia. Muszą być oddzielone przecinkiem. Rozwijając powyższy przykład, jeśli chcesz ukryć oczekujące i dostarczone zamówienia w widoku Wszystkie, możesz zmienić adres URL strony Zamówienia na:

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

Strona Zamówienia nie będzie już wyświetlać zamówień oczekujących i dostarczonych w widoku Wszystkie:

Excludes Pending & Delivered orders from being displayed from all orders view
Wyłącza wyświetlanie oczekujących i dostarczonych zamówień z widoku wszystkich zamówień

Oto odniesienie do domyślnych statusów zamówień WooCommerce i ich odpowiednich ślimaków.

  • Oczekująca płatność – wc-pending
  • Nieudane – nieudane wc
  • Przetwarzanie – przetwarzanie wc
  • Ukończone – wc-zakończone
  • Wstrzymanie – wstrzymanie toalety
  • Anulowane – anulowane wc
  • Zwrot kosztów – zwrot wc

Dodanie statusów zamówień bezpośrednio w adresie URL nie jest najlepszym podejściem. Ale ideą tego posta jest pokazanie, w jaki sposób można osiągnąć cel.

Czy próbowałeś innego podejścia do filtrowania zamówień według statusu zamówienia w WooCommerce? Bardzo chciałbym ich poznać.