Come filtrare gli ordini WooCommerce in base a più stati degli ordini?

Pubblicato: 2019-02-16

Uno dei nostri clienti ci ha recentemente posto questa domanda per la sua pagina Ordini WooCommerce in admin: C'è un modo per selezionare più stati nel back-end dell'ordine?

Sebbene i proprietari dei negozi WooCommerce potrebbero non aver bisogno di farlo regolarmente, ma questo aiuterebbe sicuramente alcuni di loro.

Questo post spiegherà come mostrare gli ordini WooCommerce con stati diversi in un'unica vista. Nella seconda metà di questo post, verificheremo anche come escludere uno o più stati quando vengono visualizzati tutti gli ordini.

Il comportamento predefinito di WooCommerce è che puoi visualizzare Tutti gli ordini o ordini per qualsiasi stato . Ma non puoi visualizzare insieme ordini di stati diversi, come ordini in sospeso e rimborsati. Oppure non puoi escludere ordini di uno stato nella vista Tutti.

WooCommerce Orders in Admin
Visualizzazione predefinita della pagina Ordini WooCommerce

Oltre agli stati dell'ordine predefiniti, ho aggiunto uno stato dell'ordine personalizzato: Consegnato. Questo è stato aggiunto utilizzando il plug-in Stato ordine personalizzato e viene aggiunto per verificare che il filtro funzioni anche con gli stati degli ordini personalizzati insieme agli stati predefiniti.

Parte 1: Filtra gli ordini WooCommerce per mostrare gli ordini di più stati in un'unica vista

Ci sono diversi modi per cercare una soluzione per questo. Potrebbe essere tramite un plug-in o aggiungendo un menu a discesa multi-selezione dello stato dell'ordine con uno snippet di codice. O in un modo grezzo, aggiungi semplicemente lo stato che desideri nell'URL.

Non è sicuramente il modo migliore, ma funziona. Potrei tornare più tardi su questo post e aggiornarlo per includere un menu a discesa multi-selezione degli stati degli ordini WooCommerce.

Diamo prima un'occhiata al codice.

 /**
 * Gestisci i filtri per includere stati woocommerce aggiuntivi
 *
 * @param array $query_vars Query vars.
 * @return array
 */
funzione ts_woocommerce_include_order_status ($ query_vars) {
  $ typenow globale;

  /**
   * Usando wc_get_order_types() invece di 'shop_order' poiché altri tipi di ordine potrebbero essere aggiunti da altri plugin
   */
  if (in_array($typenow, wc_get_order_types('order-meta-box'), true)) {
    if ( isset( $_GET['include_status'] ) && '' != $_GET['include_status']
       && isset($query_vars['post_status'] ) ) {
      $include_status = esplode(',', $_GET['include_status'] );
      $q_post_status[] = $query_vars['post_status'];
      $query_vars['post_status'] = array_merge($q_post_status, $include_status);
    }
  }
  restituisce $var_query;
}
add_filter( 'richiesta', 'ts_woocommerce_include_order_status', 20, 1 );

Stiamo facendo alcune cose nello snippet sopra.

Innanzitutto, alleghiamo la nostra funzione al filtro delle richieste di WordPress.

Poiché vogliamo che il nostro codice venga eseguito solo per la pagina degli ordini di WooCommerce, lo facciamo assicurandoci che la variabile $typenow sia presente nell'array restituito dalla funzione wc_get_order_types(). In questo caso, $typenow è impostato su shop_order . Questo è il post_type degli ordini creati da WooCommerce.

include_status è la variabile GET in cui dovresti passare altri stati dell'ordine che desideri vengano visualizzati. È possibile passare più stati degli ordini separati da virgole. Dovresti prima filtrare l'ordine in base a 1 stato dell'ordine che desideri vedere. Supponiamo che tu abbia filtrato gli ordini in sospeso.

WooCommerce Orders with Pending status
Ordini WooCommerce con stato In sospeso

Se vuoi vedere gli ordini rimborsati insieme agli ordini in sospeso, non è possibile. Tuttavia, se aggiungi lo snippet di codice sopra nel functions.php del tuo tema figlio, e poi se modifichi l'URL della pagina Ordini nel link sottostante nel tuo browser:

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

vedrai che gli ordini in sospeso e rimborsati verranno visualizzati.

WooCommerce orders with status as Pending & Refunded being shown
Ordini WooCommerce con stato in sospeso e rimborsati visualizzati

Nel parametro include_status, puoi anche passare più stati degli ordini separati da virgole. Quindi, se desideri visualizzare gli ordini in sospeso, rimborsati e consegnati, puoi farlo modificando l'URL come di seguito:

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

È importante notare che Consegnato è uno stato personalizzato che ho aggiunto nella mia installazione di prova di WooCommerce. La sua lumaca è consegnata tramite wc. Lo stato viene aggiunto con il plug-in Stato ordine personalizzato.

Quando apri il link sopra, vedrai gli ordini con questi 3 stati:

WooCommerce orders with status as Pending, Refunded & Delivered being shown
Ordini WooCommerce con stato come In sospeso, Rimborsato e Consegnato visualizzati

La virgola nell'URL viene sostituita con %2C a causa della codifica dell'URL.

Parte 2: Filtra gli ordini WooCommerce per nascondere gli ordini di uno o più stati nella vista Tutti

Per impostazione predefinita, ti viene presentata una vista in cui gli ordini WooCommerce di tutti gli stati sono mostrati nella pagina Ordini.

WooCommerce Orders in Admin

Di seguito ho creato uno snippet di codice che ti consente di passare una variabile nell'URL, exclude_status . Nella variabile exclude_status, puoi passare lo slug dello stato che desideri escludere dalla visualizzazione nella pagina Ordini nella vista Tutti. Ecco il codice:

 /**
 * Gestisci i filtri per escludere gli stati woocommerce dalla vista Tutti gli ordini
 *
 * @param array $query_vars Query vars.
 * @return array
 */
funzione ts_woocommerce_exclude_order_status ($ query_vars) {
  $ typenow globale;

  /**
   * Usando wc_get_order_types() invece di 'shop_order' poiché altri tipi di ordine potrebbero essere aggiunti da altri plugin
   */
  if (in_array($typenow, wc_get_order_types('order-meta-box'), true)) {
    if ( isset( $_GET['exclude_status'] ) && '' != $_GET['exclude_status']
       && isset($query_vars['post_status'] ) ) {
      $exclude_status = esplode( ',', $_GET['exclude_status'] );
      foreach ($exclude_status come $chiave => $valore) {
        if ( ( $chiave = array_search( $valore, $query_vars['post_status'] ) ) !== false) {
          unset($query_vars['post_status'][$chiave]);
        }
      }
    }
  }
  restituisce $var_query;
}
add_filter( 'richiesta', 'ts_woocommerce_exclude_order_status', 20, 1 );

Quando il codice sopra viene aggiunto nel file functions.php del tuo tema figlio, e quindi se modifichi l'URL della tua pagina degli ordini di WooCommerce con quella qui sotto:

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

Quindi gli ordini con stato In sospeso non verranno visualizzati nella visualizzazione predefinita di Tutti gli ordini:

Excludes Pending orders from being displayed from all orders view
Esclude la visualizzazione degli ordini in sospeso dalla visualizzazione di tutti gli ordini

Puoi anche specificare più stati dell'ordine da escludere. Devono essere separati da virgola. Espandendo l'esempio sopra, se desideri nascondere gli ordini in sospeso e consegnati dalla vista Tutti, puoi modificare l'URL della pagina Ordini in:

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

La pagina Ordini non mostrerà più gli ordini in sospeso e consegnati nella vista Tutti:

Excludes Pending & Delivered orders from being displayed from all orders view
Esclude la visualizzazione degli ordini in sospeso e consegnati dalla visualizzazione di tutti gli ordini

Ecco un riferimento agli stati degli ordini WooCommerce predefiniti e ai rispettivi slug.

  • Pagamento in sospeso – wc-in sospeso
  • Fallito – wc-fallito
  • Elaborazione – elaborazione wc
  • Completato – wc-completato
  • In attesa: wc in attesa
  • Annullato – wc-cancellato
  • Rimborsato – wc-rimborsato

L'aggiunta diretta degli stati dell'ordine nell'URL non è l'approccio migliore. Ma l'idea di questo post è mostrare come l'obiettivo può essere raggiunto.

Hai provato qualche altro approccio per filtrare gli ordini in base allo stato degli ordini in WooCommerce? Mi piacerebbe conoscerli.