¿Cómo filtrar los pedidos de WooCommerce por múltiples estados de pedido?
Publicado: 2019-02-16Uno 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.

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.

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.

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:

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

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:

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.