HUSKY - WooCommerce Product Filter Professional

Filtro WooCommerce: Mostrar Apenas Atributos da Categoria Atual

Quando várias categorias de produtos compartilham um mesmo atributo, um filtro do WooCommerce costuma oferecer valores que não fazem sentido na página: Grelha (Grill) em geladeiras, 512 GB em fones de ouvido, marcas que não são vendidas nesta categoria. Clicar neles resulta em uma lista vazia. Para que o filtro do WooCommerce mostre apenas os atributos da categoria atual, o HUSKY conta os produtos por trás de cada termo da página e oculta os termos cuja contagem é zero. A seguir, como isso funciona, as configurações exatas, como manter os números invisíveis e os casos em que a categoria não é conhecida de forma alguma.

Como o filtro sabe o que pertence à categoria atual

Em uma página de categoria de produtos, e em qualquer outro arquivo de taxonomia de produtos (uma tag, um arquivo de atributo, uma marca), o HUSKY memoriza o termo que a página está exibindo. Com a Recontagem dinâmica (Dynamic recount) ativada, o número ao lado de cada termo do filtro é calculado assim: produtos desta categoria que correspondem a tudo o que o visitante já selecionou e que também têm este termo. Um valor que nenhum produto da categoria possui recebe 0.

Então Ocultar termos vazios (Hide empty terms) remove do formulário todo termo com 0. Quando todos os termos de uma seção são removidos, a seção inteira, título incluído, também desaparece, de modo que um atributo que não é usado na categoria some da barra lateral. A própria seção de categorias é reduzida às subcategorias da categoria visualizada; por que o filtro mostra apenas subcategorias explica essa parte e suas exceções.

Nada precisa ser configurado por categoria. O mesmo formulário colocado em uma barra lateral ou no template de categoria se adapta sozinho a cada página de categoria.

As três configurações que ocultam termos vazios

Abra as configurações do plugin, aba Opções (Options), e defina:

  1. Mostrar contagem (Show count): Sim
  2. Recontagem dinâmica (Dynamic recount): Sim
  3. Ocultar termos vazios (Hide empty terms): Sim

Salve e, em seguida, limpe todos os caches que possam guardar contagens antigas: Cache do número de recontagem dinâmica para cada item no filtro (Cache dynamic recount number for each item in filter) e Cache de termos (Cache terms) em Avançado → Opções (Advanced → Options), se você os utiliza, e o cache de página do seu site.

As três opções dependem umas das outras, e a página de configurações impõe isso: um termo vazio só pode ser encontrado por contagem. Ativar Ocultar termos vazios (Hide empty terms) também ativa as outras duas, e desativar Mostrar contagem (Show count) também desativa as outras duas. Se você definir Mostrar contagem (Show count) como Não para se livrar dos números, os termos vazios voltam em todas as páginas. As combinações possíveis:

Mostrar contagem / Recontagem dinâmica / Ocultar termos vaziosO que os visitantes veem
Não / Não / NãoTodos os termos, sem números
Sim / Não / NãoNúmeros de toda a loja; termos sem nenhum produto aparecem acinzentados
Sim / Sim / NãoNúmeros para a categoria e a seleção atuais; termos com zero permanecem visíveis, mas acinzentados e não podem ser selecionados
Sim / Sim / SimTermos com zero ficam ocultos; seções vazias desaparecem

A terceira linha é a escolha quando você prefere mostrar os valores indisponíveis como inativos em vez de removê-los. Mais alguns lugares podem sobrepor as opções globais:

  • Na versão gratuita, Ocultar termos vazios (Hide empty terms) e Ocultar o texto de contagem dos termos (Hide terms count text) (abaixo) aparecem acinzentados; fazem parte da versão premium.
  • O widget de filtro do HUSKY tem o seu próprio campo Recontagem dinâmica (Dynamic recount) (Padrão (Default), Não (No), Sim (Yes)). Se estiver definido como Não (No), esse widget ignora a configuração global. O shortcode [woof] tem o mesmo controle como dynamic_recount=1 ou dynamic_recount=0.
  • Quando o modo Turbo está ativado, a aba Opções (Options) mostra cópias separadas dessas três configurações para o modo Turbo. Defina-as novamente depois de ativá-lo.
  • Uma taxonomia exibida como controle deslizante de faixa não é recontada pelas opções globais. Abra as opções adicionais dela (o ícone de engrenagem ao lado da taxonomia na aba Estrutura (Structure)) e defina Ativar recontagem dinâmica (Enable dynamic recount) como Sim; os valores sem produtos ficam então fora da escala do controle deslizante.

A documentação da aba Opções descreve as outras configurações da mesma tela.

Ocultar termos vazios sem mostrar a contagem

O desejo mais comum é ocultar os termos vazios sem imprimir números como (12). Mantenha as três opções ativadas e vá a Avançado → Opções (Advanced → Options): defina Ocultar o texto de contagem dos termos (Hide terms count text) como Sim. O plugin continua calculando as contagens, de que precisa para saber o que está vazio, mas não as imprime. Para fazer isso em um único formulário, adicione hide_terms_count=1 ao shortcode dele, por exemplo [woof hide_terms_count=1].

Ocultar o contador com CSS também funciona para caixas de seleção e botões de opção (.woof_checkbox_count, .woof_radio_count), mas não para listas suspensas: nelas o número faz parte do texto da opção e não tem um elemento próprio. A configuração cobre todos os tipos de filtro.

Para alterar o contador apenas em algumas seções, use o hook woof_term_count_format. Ele recebe o formato, (%d) por padrão, e o slug da taxonomia:

/*
 * HUSKY: counter format per filter section.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woof_term_count_format', function ($format, $tax_slug) {
    // no numbers at all in the Tags and Brand sections
    if (in_array($tax_slug, array('product_tag', 'pa_brand'), true)) {
        return '';
    }
    // "12" instead of "(12)" everywhere else
    return '%d';
}, 10, 2);

Os termos vazios continuam ocultos nessas seções, porque a ocultação depende da contagem calculada, não do texto impresso. Para mostrar números apenas no nível mais baixo de uma árvore de categorias, oculte com CSS os contadores dos termos que têm filhos (campo de CSS personalizado do seu tema):

.woof_childs_list_li > .woof_checkbox_label > .woof_checkbox_count {
    display: none;
}

Um termo selecionado nunca mostra um número. Isso é intencional: a recontagem ignora os termos que já fazem parte da busca.

Por que outros valores desaparecem depois da primeira seleção

A recontagem dinâmica estreita o formulário a cada escolha: depois de selecionar Marca: Bosch (Brand: Bosch), restam apenas as cores que os produtos Bosch desta categoria têm. Esse é o objetivo do recurso. Ele não pode ser desativado para uma única seção.

Outro caso é quando escolher uma cor oculta todas as outras cores. Isso vem da lógica da seção. Abra as opções adicionais da taxonomia (o ícone de engrenagem na aba Estrutura (Structure)) e veja Lógica de filtragem (Logic of filtering):

  • OR (padrão): produtos que têm pelo menos um dos valores selecionados. Cada outra cor é contada separadamente (dentro das seleções das outras seções), de modo que as cores que existem na categoria permanecem.
  • AND: produtos que têm todos os valores selecionados ao mesmo tempo. A contagem de cada outra cor passa a ser "produtos que são vermelhos e azuis ao mesmo tempo", geralmente 0, e por isso, com Ocultar termos vazios (Hide empty terms), elas desaparecem.
  • NOT IN: exclui os produtos com os valores selecionados.

Para cores, tamanhos e a maioria dos atributos em que o visitante quer "este ou aquele", OR é a lógica correta. Mantenha AND para características que precisam estar todas presentes, como "Wi-Fi e Bluetooth".

Para opções que se estreitam antes de qualquer produto ser carregado (um localizador feito de listas suspensas dependentes), use [woof ajax_redraw=1 autosubmit=1]: cada alteração redesenha apenas o formulário com as opções recontadas, e o botão de filtro carrega os produtos. ajax_redraw não foi feito para o modo AJAX, portanto mantenha Tentar usar AJAX na loja (Try to ajaxify the shop) desativado para esse formulário.

Página da loja, páginas personalizadas e construtores de páginas

O estreitamento automático precisa de um arquivo de taxonomia. Fora dele, não existe categoria atual:

  • A página principal da loja mostra todo o catálogo, então, até que o visitante selecione algo, apenas os valores sem nenhum produto na loja ficam ocultos. Esse é o comportamento correto.
  • Uma página do WordPress (uma página inicial, uma landing page, uma página criada com Elementor ou Divi que lista uma categoria) não é um arquivo de categoria, mesmo que mostre apenas os produtos dessa categoria. O filtro não tem como saber disso e lista tudo.

Em uma página assim, informe aos dois shortcodes de qual categoria a página trata. Use o ID do termo em Produtos → Categorias (Products → Categories):

[woof taxonomies=product_cat:15]
[woof_products taxonomies=product_cat:15 per_page=12]

O atributo taxonomies de [woof] faz as contagens e a ocultação seguirem essa categoria, e o mesmo atributo em [woof_products] limita os produtos exibidos. Vários IDs de uma mesma taxonomia são separados por vírgulas (product_cat:15,16, produtos em qualquer uma delas), várias taxonomias por um sinal de mais (product_cat:15+pa_color:22). Funciona somente com as três opções acima ativadas. A configuração completa dessas páginas está em o filtro de produtos em uma página personalizada ou na página inicial.

Se você precisa de um conjunto diferente de seções por categoria, e não de valores diferentes, veja como mostrar filtros diferentes por categoria.

Se o filtro em um arquivo de categoria real ainda se comportar como na página da loja, o template de arquivo do tema pode estar ocultando a categoria atual do plugin; isso acontece principalmente com templates baseados em blocos. Em Avançado → Opções (Advanced → Options), defina Verificação adicional da página de categoria (Additional check of the category page) como Sim.

Uma opção mais leve, sem recontagem dinâmica

Se você só precisa ocultar os termos que não têm produtos em lugar nenhum da loja (tamanhos antigos, uma marca que você deixou de vender), não precisa da recontagem dinâmica. Este trecho pede ao WordPress que ignore esses termos quando o HUSKY os carrega:

/*
 * HUSKY: do not list terms that have no published products at all.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woof_get_terms_args', function ($args) {
    $args['hide_empty'] = true;
    return $args;
});

Não custa nada no carregamento da página, mas não conhece a categoria atual nem a seleção do visitante: um tamanho que existe somente em calçados ainda aparece na categoria de camisas. Se Cache de termos (Cache terms) estiver ativado, limpe o cache de termos depois de adicionar o código. O FAQ como ocultar termos vazios mostra o mesmo trecho.

O que a recontagem dinâmica custa em catálogos grandes

Cada termo do formulário precisa de sua própria consulta de contagem em cada visualização de página, os ocultos inclusive; assim, um formulário com 300 termos executa cerca de 300 consultas de contagem. Com alguns milhares de produtos isso passa despercebido; com dezenas de milhares, pode deixar lenta cada página de categoria. Antes de desativar o recurso:

  • ative Cache do número de recontagem dinâmica para cada item no filtro (Cache dynamic recount number for each item in filter) em Avançado → Opções (Advanced → Options);
  • use dynamic_recount=0 nos formulários em que o estreitamento não é necessário, por exemplo um formulário de busca no cabeçalho;
  • considere o modo Turbo, que filtra e conta a partir de um arquivo de dados preparado em vez de consultas ao banco de dados.

Os detalhes estão em como acelerar a filtragem de produtos em catálogos grandes.

Lista de verificação quando opções irrelevantes ainda aparecem

  • Mostrar contagem (Show count), Recontagem dinâmica (Dynamic recount) e Ocultar termos vazios (Hide empty terms) estão todas em Sim (ou as cópias delas do modo Turbo, se o modo Turbo estiver ativado).
  • Os números estão ocultos com Ocultar o texto de contagem dos termos (Hide terms count text), e não definindo Mostrar contagem (Show count) como Não.
  • O campo Recontagem dinâmica (Dynamic recount) do widget está em Padrão (Default) ou Sim (Yes); não há dynamic_recount=0 no shortcode.
  • Você está testando em um arquivo de categoria real, ou o shortcode tem taxonomies= em uma página personalizada.
  • O cache de recontagem, o cache de termos e o cache de página foram limpos depois da alteração.
  • A Lógica de filtragem (Logic of filtering) do atributo é OR se outros valores precisam permanecer após uma seleção.

Se tudo isso estiver correto e uma categoria ainda listar valores sem produtos, abra um tópico no fórum de suporte do HUSKY com o link da página da categoria e o valor que deveria ser ocultado.