Como filtrar pedidos do WooCommerce por vários status de pedidos?

Publicados: 2019-02-16

Um de nossos clientes recentemente nos fez esta pergunta para a página de pedidos do WooCommerce no administrador: Existe uma maneira de selecionar vários status no back-end do pedido?

Embora os proprietários de lojas WooCommerce possam não precisar fazer isso regularmente, isso definitivamente ajudaria alguns deles.

Esta postagem explica como mostrar pedidos do WooCommerce com diferentes status em uma visualização. Na 2ª metade deste post, veremos também como excluir um ou vários status quando todos os pedidos estiverem sendo exibidos.

O comportamento padrão do WooCommerce é que você pode visualizar Todos os pedidos ou pedidos para qualquer status . Mas você não pode visualizar pedidos de status diferentes juntos, como pedidos pendentes e reembolsados. Ou você não pode excluir pedidos de um status na exibição Todos.

WooCommerce Orders in Admin
Visualização da página de pedidos padrão do WooCommerce

Além dos status de pedido padrão, adicionei um status de pedido personalizado: Entregue . Isso foi adicionado usando o plug-in Status do pedido personalizado e foi adicionado para verificar se a filtragem também funcionaria com os status do pedido personalizado junto com os status padrão.

Parte 1: Filtre os pedidos do WooCommerce para mostrar pedidos de vários status em uma visualização

Existem várias maneiras de procurar uma solução para isso. Pode ser por meio de um plug-in ou adicionando um menu suspenso de seleção múltipla do status do pedido com um snippet de código. Ou de uma forma grosseira, basta adicionar o status desejado na URL.

Definitivamente não é a melhor maneira, mas funciona. Posso voltar mais tarde a este post e atualizá-lo para incluir um menu suspenso de seleção múltipla de status de pedidos do WooCommerce.

Vejamos primeiro o código.

 /**
 * Manipule filtros para incluir status adicionais de woocommerce
 *
 * @param array $query_vars Consulta vars.
 * @return array
 */
function ts_woocommerce_include_order_status($query_vars) {
  global $tipoagora;

  /**
   * Usando wc_get_order_types() em vez de 'shop_order', pois outros tipos de pedidos podem ser adicionados por outros 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 = explodir( ',', $_GET['include_status']);
      $q_post_status[] = $query_vars['post_status'];
      $query_vars['post_status'] = array_merge( $q_post_status, $include_status );
    }
  }
  return $query_vars;
}
add_filter( 'pedido', 'ts_woocommerce_include_order_status', 20, 1 );

Estamos fazendo algumas coisas no trecho acima.

Primeiro, anexamos nossa função ao filtro de solicitações do WordPress.

Como queremos que nosso código seja executado apenas para a página WooCommerce Orders, fazemos isso garantindo que a variável $typenow esteja presente no array retornado da função wc_get_order_types(). Nesse caso, $typenow é definido como shop_order . Esse é o post_type dos pedidos criados pelo WooCommerce.

include_status é a variável GET na qual você deve passar outros status de pedidos que deseja que sejam exibidos. Vários status de pedidos podem ser separados por vírgulas. Você deve primeiro filtrar o pedido por qualquer 1 status de pedido que deseja ver. Digamos que você tenha filtrado por pedidos pendentes.

WooCommerce Orders with Pending status
Pedidos WooCommerce com status pendente

Se você quiser ver os pedidos reembolsados ​​junto com os pedidos pendentes, isso não é possível. No entanto, se você adicionar o trecho de código acima no functions.php do seu tema filho e, em seguida, alterar a URL da página Pedidos para o link abaixo em seu navegador:

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

você verá que os pedidos pendentes e reembolsados ​​serão exibidos.

WooCommerce orders with status as Pending & Refunded being shown
Pedidos WooCommerce com status como Pendente e Reembolsado sendo exibido

No parâmetro include_status, você também pode passar vários status de pedidos separados por vírgula. Portanto, se você quiser visualizar pedidos pendentes, reembolsados ​​e entregues, poderá fazê-lo alterando o URL conforme abaixo:

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

É importante observar que Entregue é um status personalizado que adicionei na minha instalação de teste do WooCommerce. É slug é wc-entregue. O status é adicionado com o plugin Custom Order Status.

Ao abrir o link acima, você verá os pedidos com esses 3 status:

WooCommerce orders with status as Pending, Refunded & Delivered being shown
Pedidos WooCommerce com status como Pendente, Reembolsado e Entregue sendo exibido

A vírgula na URL é substituída por %2C devido à codificação da URL.

Parte 2: Filtre os pedidos do WooCommerce para ocultar pedidos de um ou mais status na visualização Todos

Por padrão, você é apresentado a uma visualização em que os pedidos do WooCommerce de todos os status são mostrados na página Pedidos.

WooCommerce Orders in Admin

Criei abaixo um trecho de código que permite passar uma variável na URL, exclude_status . Na variável exclude_status, você pode passar o slug do status que deseja excluir da exibição na página Pedidos na visualização Todos. Aqui está o código:

 /**
 * Manipular filtros para excluir status do woocommerce da visualização de todos os pedidos
 *
 * @param array $query_vars Consulta vars.
 * @return array
 */
function ts_woocommerce_exclude_order_status($query_vars) {
  global $tipoagora;

  /**
   * Usando wc_get_order_types() em vez de 'shop_order', pois outros tipos de pedidos podem ser adicionados por outros 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 = explodir( ',', $_GET['exclude_status']);
      foreach ( $exclude_status as $chave => $valor) {
        if ( ( $ chave = array_search( $ valor, $ consulta_vars['post_status'] ) !== false) {
          unset( $query_vars['post_status'][$key]);
        }
      }
    }
  }
  return $query_vars;
}
add_filter( 'pedido', 'ts_woocommerce_exclude_order_status', 20, 1 );

Quando o código acima é adicionado no arquivo functions.php do seu tema filho e, em seguida, se você alterar o URL da sua página de pedidos do WooCommerce para o abaixo:

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

Então os pedidos com status Pendente não serão exibidos na visualização padrão de Todos os pedidos:

Excludes Pending orders from being displayed from all orders view
Exclui pedidos pendentes da exibição de todos os pedidos

Você também pode especificar vários status de pedido a serem excluídos. Eles precisam ser separados por vírgula. Expandindo o exemplo acima, se você quiser ocultar pedidos pendentes e entregues da exibição Todos, poderá alterar o URL da página de pedidos para:

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

A página Pedidos não mostrará mais pedidos pendentes e entregues na visualização Todos:

Excludes Pending & Delivered orders from being displayed from all orders view
Exclui pedidos pendentes e entregues da exibição de todos os pedidos

Aqui está uma referência dos status de pedido padrão do WooCommerce e seus respectivos slugs.

  • Pagamento pendente - wc-pendente
  • Falha - wc-falhou
  • Processamento - wc-processing
  • Concluído - wc-concluído
  • Em espera - wc em espera
  • Cancelado – wc-cancelado
  • Reembolsado - wc-reembolsado

Adicionar os status do pedido diretamente na URL não é a melhor abordagem. Mas a ideia deste post é mostrar como o objetivo pode ser alcançado.

Você já tentou alguma outra abordagem para filtrar pedidos por status de pedido no WooCommerce? Eu adoraria conhecê-los.