Comment filtrer les commandes WooCommerce par plusieurs statuts de commande ?

Publié: 2019-02-16

Un de nos clients nous a récemment posé cette question pour sa page de commandes WooCommerce dans l'administration : Existe-t-il un moyen de sélectionner plusieurs statuts dans le backend de commande ?

Bien que les propriétaires de magasins WooCommerce n'aient peut-être pas besoin de le faire régulièrement, cela aiderait certainement certains d'entre eux.

Cet article explique comment afficher les commandes WooCommerce avec différents statuts dans une seule vue. Dans la 2ème moitié de cet article, nous verrons également comment exclure un ou plusieurs statuts lorsque toutes les commandes sont affichées.

Le comportement par défaut de WooCommerce est que vous pouvez afficher toutes les commandes ou les commandes pour n'importe quel statut . Mais vous ne pouvez pas afficher les commandes de statuts différents ensemble, comme les commandes en attente et remboursées. Ou vous ne pouvez pas exclure les commandes d'un statut dans la vue Tout.

WooCommerce Orders in Admin
Vue par défaut de la page des commandes WooCommerce

Outre les statuts de commande par défaut, j'ai ajouté un statut de commande personnalisé : Livré . Cela a été ajouté à l'aide du plug-in Custom Order Status et est ajouté pour vérifier que le filtrage fonctionnerait également avec les statuts de commande personnalisés ainsi que les statuts par défaut.

Partie 1 : Filtrer les commandes WooCommerce pour afficher les commandes de plusieurs statuts dans une seule vue

Il existe plusieurs façons de rechercher une solution à cela. Cela peut être soit via un plugin, soit en ajoutant une liste déroulante à sélection multiple du statut de la commande avec un extrait de code. Ou d'une manière grossière, ajoutez simplement le statut que vous voulez dans l'URL.

Ce n'est certainement pas la meilleure façon, mais ça marche. Je reviendrai peut-être plus tard sur cet article et le mettrai à jour pour inclure une liste déroulante à sélection multiple des statuts de commande WooCommerce.

Regardons d'abord le code.

 /**
 * Gérer les filtres pour inclure des statuts woocommerce supplémentaires
 *
 * @param array $query_vars Requête vars.
 * tableau @return
 */
fonction ts_woocommerce_include_order_status( $query_vars ) {
  global $typenow ;

  /**
   * Utilisation de wc_get_order_types() au lieu de 'shop_order' car d'autres types de commandes pourraient être ajoutés par d'autres plugins
   */
  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 = éclater( ',', $_GET['include_status'] );
      $q_post_status[] = $query_vars['post_status'] ;
      $query_vars['post_status'] = array_merge( $q_post_status, $include_status );
    }
  }
  retourne $query_vars ;
}
add_filter( 'request', 'ts_woocommerce_include_order_status', 20, 1 );

Nous faisons quelques choses dans l'extrait ci-dessus.

Tout d'abord, nous attachons notre fonction au filtre de requête de WordPress.

Parce que nous voulons que notre code ne s'exécute que pour la page Commandes WooCommerce, nous le faisons en nous assurant que la variable $typenow est présente dans le tableau renvoyé par la fonction wc_get_order_types(). Dans ce cas, $typenow est défini sur shop_order . C'est le post_type des commandes créées par WooCommerce.

include_status est la variable GET dans laquelle vous devez passer d'autres statuts de commande que vous souhaitez afficher. Plusieurs statuts de commande peuvent être passés séparés par des virgules. Vous devez d'abord filtrer la commande par n'importe quel statut de commande que vous souhaitez voir. Supposons que vous ayez filtré par commandes en attente.

WooCommerce Orders with Pending status
Commandes WooCommerce avec le statut En attente

Si vous souhaitez voir les commandes remboursées avec les commandes en attente, ce n'est pas possible. Cependant, si vous ajoutez l'extrait de code ci-dessus dans le fichier functions.php de votre thème enfant, puis si vous modifiez l'URL de la page Commandes avec le lien ci-dessous dans votre navigateur :

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

vous verrez que les commandes en attente ainsi que les commandes remboursées apparaîtront.

WooCommerce orders with status as Pending & Refunded being shown
Les commandes WooCommerce avec le statut En attente et Remboursées sont affichées

Dans le paramètre include_status, vous pouvez également passer plusieurs statuts de commande séparés par des virgules. Donc, si vous souhaitez afficher les commandes en attente, remboursées et livrées, vous pouvez le faire en modifiant l'URL comme ci-dessous :

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

Il est important de noter que Livré est un statut personnalisé que j'ai ajouté dans mon installation de test WooCommerce. C'est slug est wc-livré. Le statut est ajouté avec le plugin Custom Order Status.

Lorsque vous ouvrez le lien ci-dessus, vous verrez les commandes avec ces 3 statuts :

WooCommerce orders with status as Pending, Refunded & Delivered being shown
Les commandes WooCommerce avec le statut En attente, Remboursées et Livrées sont affichées

La virgule dans l'URL est remplacée par %2C en raison de l'encodage de l'URL.

Partie 2 : Filtrer les commandes WooCommerce pour masquer les commandes d'un ou plusieurs statuts dans la vue Tout

Par défaut, vous êtes présenté avec une vue où les commandes WooCommerce de tous les statuts sont affichées sur la page Commandes.

WooCommerce Orders in Admin

J'ai créé ci-dessous un extrait de code qui vous permet de passer une variable dans l'URL, exclude_status . Dans la variable exclude_status, vous pouvez passer le slug du statut que vous souhaitez exclure de l'affichage sur la page Commandes dans la vue Toutes. Voici le code :

 /**
 * Gérer les filtres pour exclure les statuts woocommerce de la vue Toutes les commandes
 *
 * @param array $query_vars Requête vars.
 * tableau @return
 */
fonction ts_woocommerce_exclude_order_status( $query_vars ) {
  global $typenow ;

  /**
   * Utilisation de wc_get_order_types() au lieu de 'shop_order' car d'autres types de commandes pourraient être ajoutés par d'autres plugins
   */
  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 = exploser( ',', $_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] );
        }
      }
    }
  }
  retourne $query_vars ;
}
add_filter( 'demande', 'ts_woocommerce_exclude_order_status', 20, 1 );

Lorsque le code ci-dessus est ajouté dans le fichier functions.php de votre thème enfant, puis si vous changez l'URL de votre page Commandes WooCommerce en celle ci-dessous :

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

Ensuite, les commandes avec le statut En attente ne seront pas affichées dans la vue par défaut de Toutes les commandes :

Excludes Pending orders from being displayed from all orders view
Exclut les commandes en attente de l'affichage de toutes les commandes

Vous pouvez également spécifier plusieurs statuts de commande à exclure. Ils doivent être séparés par une virgule. En développant l'exemple ci-dessus, si vous souhaitez masquer les commandes en attente et livrées de la vue Toutes, vous pouvez modifier l'URL de votre page Commandes en :

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

La page Commandes n'affichera plus les commandes en attente et livrées dans la vue Toutes :

Excludes Pending & Delivered orders from being displayed from all orders view
Exclut les commandes en attente et livrées de l'affichage de toutes les commandes

Voici une référence des statuts de commande WooCommerce par défaut et de leurs slugs respectifs.

  • En attente de paiement – ​​wc-pending
  • Échec - wc-échec
  • Traitement – ​​wc-traitement
  • Terminé - wc-terminé
  • En attente - wc en attente
  • Annulé – wc-annulé
  • Remboursé - wc-remboursé

L'ajout direct des statuts de commande dans l'URL n'est pas la meilleure approche. Mais l'idée de ce post est de montrer comment l'objectif peut être atteint.

Avez-vous essayé une autre approche pour filtrer les commandes par statut de commande dans WooCommerce ? J'aimerais les connaître.