¿Cómo filtrar los pedidos de WooCommerce por múltiples estados de pedido?

Publicado: 2019-02-16

Uno de nuestros clientes recientemente nos hizo esta pregunta para su página de Pedidos de WooCommerce en el administrador: ¿Hay alguna forma de seleccionar varios estados en el backend del pedido?

Aunque es posible que los propietarios de las tiendas WooCommerce no necesiten hacer esto regularmente, esto definitivamente ayudaría a algunos de ellos.

Esta publicación explicará cómo mostrar los pedidos de WooCommerce con diferentes estados en una sola vista. En la segunda mitad de esta publicación, también veremos cómo excluir uno o varios estados cuando se muestran todos los pedidos.

El comportamiento predeterminado de WooCommerce es que puede ver Todos los pedidos o los pedidos para cualquier estado . Pero no puede ver pedidos de diferentes estados juntos, como pedidos pendientes y reembolsados. O no puede excluir pedidos de un estado en la vista Todos.

WooCommerce Orders in Admin
Vista de página de pedidos de WooCommerce predeterminada

Además de los estados de pedido predeterminados, he agregado un estado de pedido personalizado: Entregado. Esto se ha agregado usando el complemento Estado de pedido personalizado y se agrega para verificar que el filtrado también funcionaría con estados de pedido personalizados junto con los estados predeterminados.

Parte 1: filtre los pedidos de WooCommerce para mostrar pedidos de múltiples estados en una sola vista

Hay varias formas de buscar una solución para esto. Podría ser a través de un complemento o agregando un menú desplegable de selección múltiple del estado del pedido con un fragmento de código. O de una manera cruda, simplemente agregue el estado que desee en la URL.

Definitivamente no es la mejor manera, pero funciona. Es posible que vuelva más tarde a esta publicación y la actualice para incluir un menú desplegable de selección múltiple de los estados de los pedidos de WooCommerce.

Veamos primero el código.

 /**
 * Manejar filtros para incluir estados adicionales de woocommerce
 *
 * @param array $query_vars Consulta vars.
 * Matriz @return
 */
función ts_woocommerce_include_order_status ($query_vars) {
  global $tipoahora;

  /**
   * Usando wc_get_order_types() en lugar de 'shop_order' ya que otros complementos podrían agregar otros tipos de pedidos
   */
  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 = explotar( ',', $_GET['include_status'] );
      $q_post_status[] = $query_vars['post_status'];
      $query_vars['post_status'] = array_merge( $q_post_status, $include_status );
    }
  }
  devolver $consulta_vars;
}
add_filter('solicitud', 'ts_woocommerce_include_order_status', 20, 1);

Estamos haciendo algunas cosas en el fragmento anterior.

Primero, adjuntamos nuestra función al filtro de solicitud de WordPress.

Como queremos que nuestro código se ejecute solo para la página de pedidos de WooCommerce, lo hacemos asegurándonos de que la variable $typenow esté presente en la matriz devuelta por la función wc_get_order_types(). En este caso, $typenow se establece en shop_order . Ese es el post_type de los pedidos creados por WooCommerce.

include_status es la variable GET en la que debe pasar otros estados de pedido que desea que se muestren. Los estados de varios pedidos se pueden pasar separados por comas. Primero debe filtrar el pedido por cualquier estado de pedido que desee ver. Digamos que filtró por órdenes pendientes.

WooCommerce Orders with Pending status
Pedidos de WooCommerce con estado Pendiente

Si desea ver los pedidos reembolsados ​​junto con los pedidos pendientes, eso no es posible. Sin embargo, si agrega el fragmento de código anterior en functions.php de su tema secundario, y luego cambia la URL de la página de Pedidos al siguiente enlace en su navegador:

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

verá que aparecerán los pedidos Pendientes y Reembolsados.

WooCommerce orders with status as Pending & Refunded being shown
Se muestran pedidos de WooCommerce con el estado Pendiente y reembolsado

En el parámetro include_status, también puede pasar varios estados de pedido separados por comas. Entonces, si desea ver los pedidos pendientes, reembolsados ​​y entregados, puede hacerlo cambiando la URL de la siguiente manera:

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

Es importante tener en cuenta que Entregado es un estado personalizado que agregué en mi instalación de prueba de WooCommerce. Su babosa se entrega en wc. El estado se agrega con el complemento Estado de pedido personalizado.

Cuando abra el enlace anterior, verá los pedidos con esos 3 estados:

WooCommerce orders with status as Pending, Refunded & Delivered being shown
Se muestran pedidos de WooCommerce con estado Pendiente, Reembolsado y Entregado

La coma en la URL se reemplaza con %2C debido a la codificación de la URL.

Parte 2: filtre los pedidos de WooCommerce para ocultar los pedidos de uno o más estados en la vista Todos

De forma predeterminada, se le presenta una vista donde los pedidos de WooCommerce de todos los estados se muestran en la página Pedidos.

WooCommerce Orders in Admin

He creado el siguiente fragmento de código que le permite pasar una variable en la URL, exclude_status . En la variable include_status, puede pasar el slug del estado que desea excluir para que no se muestre en la página Pedidos en la vista Todos. Aquí está el código:

 /**
 * Manejar filtros para excluir estados de woocommerce de la vista Todos los pedidos
 *
 * @param array $query_vars Consulta vars.
 * Matriz @return
 */
función ts_woocommerce_exclude_order_status ($query_vars) {
  global $tipoahora;

  /**
   * Usando wc_get_order_types() en lugar de 'shop_order' ya que otros complementos podrían agregar otros tipos de pedidos
   */
  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 = explotar( ',', $_GET['exclude_status'] );
      foreach ( $exclude_status como $clave => $valor ) {
        if ( ( $clave = array_search( $valor, $query_vars['post_status'] ) ) !== falso) {
          unset( $query_vars['post_status'][$clave] );
        }
      }
    }
  }
  devolver $consulta_vars;
}
add_filter('solicitud', 'ts_woocommerce_exclude_order_status', 20, 1);

Cuando el código anterior se agrega en el archivo functions.php de su tema secundario, y luego si cambia la URL de su página de pedidos de WooCommerce a la siguiente:

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

Entonces los pedidos con estado Pendiente no se mostrarán en la vista predeterminada de Todos los pedidos:

Excludes Pending orders from being displayed from all orders view
Excluye los pedidos pendientes para que no se muestren en la vista de todos los pedidos

También puede especificar varios estados de pedido para excluir. Deben estar separados por comas. Ampliando el ejemplo anterior, si desea ocultar los pedidos pendientes y entregados de la vista Todos, puede cambiar la URL de su página de pedidos a:

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

La página Pedidos ya no mostrará los pedidos pendientes y entregados en la vista Todos:

Excludes Pending & Delivered orders from being displayed from all orders view
Excluye los pedidos pendientes y entregados de la vista de todos los pedidos

Aquí hay una referencia de los estados de pedido predeterminados de WooCommerce y sus respectivos slugs.

  • Pendiente de pago – wc-pendiente
  • Error – wc-error
  • Procesamiento – wc-procesamiento
  • Completado - wc-completado
  • En espera - wc-en-espera
  • Cancelado – wc-cancelado
  • Reembolsado – wc-reembolsado

Agregar los estados de los pedidos en la URL directamente no es el mejor enfoque. Pero la idea de este post es mostrar cómo se puede lograr el objetivo.

¿Ha probado algún otro enfoque para filtrar pedidos por estado de pedido en WooCommerce? Me encantaría conocerlos.