Come filtrare gli ordini WooCommerce in base a più stati degli ordini?
Pubblicato: 2019-02-16Uno 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.

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.

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.

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:

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.
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:

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:

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.