HUSKY - Product Filter for WooCommerce

Como Mostrar Diferentes Filtros do WooCommerce por Categoria (Filtragem Dinâmica)

Aprenda a exibir diferentes conjuntos de filtros com base nas categorias de produtos, criar filtros dependentes e personalizar filtros para a página da Loja WooCommerce.

O Problema

Por padrão, o WOOF exibe os mesmos filtros em todas as páginas. No entanto, diferentes categorias de produtos geralmente precisam de opções de filtro diferentes:

Exemplos de cenários:

  • Categoria Eletrônicos: Exibir Marca, Tamanho da Tela, Armazenamento, RAM
  • Categoria Roupas: Exibir Tamanho, Cor, Material, Estilo
  • Categoria Móveis: Exibir Material, Cor, Dimensões, Tipo de Cômodo
  • Página da Loja (arquivo principal): Exibir apenas Categorias, Faixa de Preço, Marcas em Destaque

Limitação atual: Todas as opções de filtro permanecem globais, mesmo após o usuário selecionar uma categoria, tornando a interface confusa com filtros irrelevantes.

O que você aprenderá:

  1. Como habilitar filtros dependentes/condicionais (filtros atualizam com base na seleção)
  2. Como exibir filtros diferentes por categoria de produto
  3. Como criar conjuntos de filtros personalizados para a página da Loja
  4. Como usar Widget Logic para controle avançado de visibilidade

 

Solução 1: Habilitar Filtros Dependentes (Redesenho AJAX)

O primeiro passo é habilitar o redesenho do formulário AJAX, que atualiza os filtros dinamicamente quando os usuários fazem seleções.

Para Widgets:

  1. Vá em Aparência → Widgets
  2. Encontre seu widget WOOF
  3. Ative a opção “Redesenho do formulário AJAX”

Isso faz com que os filtros atualizem automaticamente após cada seleção, exibindo apenas opções relevantes.

Para Shortcodes:

Adicione o atributo ajax_redraw ao seu shortcode WOOF:

[woof ajax_redraw="1"]

O que isso faz:

  • Quando o usuário seleciona “Roda” → outros filtros atualizam automaticamente
  • Mostra apenas SubTipos, Materiais, Cores disponíveis para Roda
  • Reduz a confusão escondendo opções irrelevantes

Documentação: https://products-filter.com/shortcode/woof

 

Solução 2: Visibilidade de Filtro Baseada em Categoria (Shortcode Personalizado)

Esta solução cria um shortcode dinâmico que exibe filtros diferentes dependendo da categoria de produto atual.

 

Passo 1: Criar Shortcode Personalizado

Adicione este código ao functions.php do seu tema filho:

/**
 * Dynamic WOOF shortcode that shows different filters per category
 * Usage: [woof_dynamic]
 */
add_shortcode('woof_dynamic', function () {
    // Check if WOOF is active
    if (!function_exists('woof_shortcode')) {
        return '<!-- WOOF plugin not active -->';
    }

    // Get current category
    $term = get_queried_object();

    // Check if we're on a product category page
    if (!$term || !isset($term->taxonomy) || $term->taxonomy !== 'product_cat') {
        return do_shortcode('[woof]'); // Show default filters
    }

    // Get category slug
    $cat = strtolower($term->slug);

    // Define which filters to show for each category
    $filters_map = [
        'wheel' => ['pa_sub-type', 'pa_material', 'pa_colour', 'pa_size'],
        'lingerie' => ['pa_size', 'pa_colour', 'pa_material'],
        'massage-candles' => ['pa_type', 'pa_material', 'pa_brand'],
        'electronics' => ['pa_brand', 'pa_screen-size', 'pa_storage'],
        'clothing' => ['pa_size', 'pa_color', 'pa_material', 'pa_style'],
        'furniture' => ['pa_material', 'pa_color', 'pa_dimensions', 'pa_room'],
    ];

    // If category not in map, show default filters
    if (!isset($filters_map[$cat])) {
        return do_shortcode('[woof]');
    }

    // Build shortcode with specific filters for this category
    $taxonomies = implode(',', $filters_map[$cat]);

    return do_shortcode('[woof tax_only="' . esc_attr($taxonomies) . '" ajax_redraw="1"]');
});

 

Passo 2: Usar o Shortcode

Substitua seu shortcode [woof] existente por:

[woof_dynamic]

Coloque este shortcode em:

  • Áreas de widget (widget Texto/HTML)
  • Blocos de construtor de páginas (Elementor, Divi, etc.)
  • Arquivos de modelo do tema: <?php echo do_shortcode('[woof_dynamic]'); ?>

 

Passo 3: Configurar Suas Categorias

Atualize o array $filters_map com seus:

  • Slugs de categorias (ex.: 'wheel', 'electronics')
  • Slugs de atributos (ex.: 'pa_brand', 'pa_size')

Encontrando seus slugs:

Slugs de categorias:

  • Vá em Produtos → Categorias
  • Passe o mouse sobre um nome de categoria
  • Olhe a URL: ...tag_ID=123&taxonomy=product_cat&post_type=product
  • Ou edite a categoria e veja o campo slug

Slugs de atributos:

  • Vá em Produtos → Atributos
  • Eles começam com pa_ seguido pelo nome do atributo
  • Exemplos: pa_color, pa_size, pa_brand, pa_material

 

Solução 3: Filtros Personalizados para a Página da Loja

A página principal da Loja WooCommerce precisa de tratamento diferente, pois não é um arquivo de categoria.

Solução Combinada: Página da Loja + Páginas de Categoria

Este código lida tanto com a página da Loja quanto com páginas de categoria individuais:

/**
 * Dynamic WOOF shortcode with Shop page support
 * Shows minimal filters on Shop, full filters on categories
 */
add_shortcode('woof_dynamic', function () {
    if (!function_exists('woof_shortcode')) {
        return '';
    }

    // Shop page (main product archive) - show minimal filters
    if (is_shop() AND !is_product_category() AND !is_product_tag()) {
        return do_shortcode('[woof tax_only="product_cat,pa_colour" by_price="1" ajax_redraw="1"]');
    }

    // Product category pages - show category-specific filters
    $term = get_queried_object();
    if ($term AND isset($term->taxonomy) AND $term->taxonomy === 'product_cat') {
        $cat = strtolower($term->slug);

        // Define filters for each category
        $filters_map = [
            'wheel' => ['pa_sub-type', 'pa_material', 'pa_colour', 'pa_size'],
            'lingerie' => ['pa_size', 'pa_colour', 'pa_material'],
            'massage-candles' => ['pa_type', 'pa_material', 'pa_brand'],
            'electronics' => ['pa_brand', 'pa_screen-size', 'pa_storage'],
            'clothing' => ['pa_size', 'pa_color', 'pa_material', 'pa_style'],
        ];

        if (isset($filters_map[$cat])) {
            $taxonomies = implode(',', $filters_map[$cat]);
            return do_shortcode('[woof tax_only="' . esc_attr($taxonomies) . '" ajax_redraw="1"]');
        }
    }

    // Fallback - show all filters
    return do_shortcode('[woof ajax_redraw="1"]');
});

O que este código faz:

  1. Na página da Loja: Exibe apenas filtros de Categorias, Cor e Preço
  2. Nas páginas de categoria: Exibe filtros específicos da categoria do mapeamento
  3. Em outras páginas: Exibe filtros padrão

Personalize filtros da página da Loja: Altere esta linha para exibir filtros diferentes na página da Loja:

[woof tax_only="product_cat,pa_colour" by_price="1" ajax_redraw="1"]

Parâmetros disponíveis:

  • tax_only="product_cat,pa_brand" – Exibir apenas estas taxonomias
  • by_price="1" – Exibir filtro de faixa de preço
  • by_only="product_cat,pa_brand" – Alternativa para tax_only
  • ajax_redraw="1" – Ativar atualizações dinâmicas

 

Solução 4: Widget Logic para Visibilidade Condicional

Se você preferir usar widgets em vez de shortcodes, pode controlar a visibilidade do widget com lógica condicional.

Passo 1: Instalar o Plugin Widget Logic

Escolha um destes plugins:

 

Passo 2: Criar Múltiplos Widgets WOOF

  1. Vá em Aparência → Widgets
  2. Adicione múltiplos widgets WOOF à sua barra lateral
  3. Configure cada widget com filtros diferentes

Passo 3: Adicionar Lógica Condicional

Para cada widget, adicione condições de visibilidade:

Exibir apenas na categoria Roda:

is_product_category('wheel')

Exibir apenas na categoria Lingerie:

is_product_category('lingerie')

Exibir apenas na página da Loja:

is_shop() AND !is_product_category()

Exibir em múltiplas categorias:

is_product_category(array('wheel', 'lingerie', 'massage-candles'))

Exibir em todos os lugares exceto na página da Loja:

!is_shop()

Exibir nas categorias Eletrônicos ou Computadores:

is_product_category('electronics') || is_product_category('computers')

Exemplos do Mundo Real

Exemplo 1: Loja de Produtos Adultos

$filters_map = [
    'wheel' => ['pa_type', 'pa_material', 'pa_color', 'pa_power-source', 'pa_waterproof'],
    'lingerie' => ['pa_size', 'pa_color', 'pa_style', 'pa_material'],
    'oil' => ['pa_type', 'pa_brand', 'pa_ingredients', 'pa_volume'],
    'toys' => ['pa_category', 'pa_material', 'pa_size', 'pa_color'],
];

 

Exemplo 2: Loja de Eletrônicos

$filters_map = [
    'laptops' => ['pa_brand', 'pa_processor', 'pa_ram', 'pa_storage', 'pa_screen-size'],
    'smartphones' => ['pa_brand', 'pa_storage', 'pa_ram', 'pa_camera', 'pa_battery'],
    'headphones' => ['pa_brand', 'pa_type', 'pa_connection', 'pa_noise-cancelling'],
    'cameras' => ['pa_brand', 'pa_megapixels', 'pa_sensor-size', 'pa_video-quality'],
];

 

Exemplo 3: Loja de Moda

$filters_map = [
    'mens-clothing' => ['pa_size', 'pa_color', 'pa_material', 'pa_brand', 'pa_style'],
    'womens-clothing' => ['pa_size', 'pa_color', 'pa_material', 'pa_brand', 'pa_occasion'],
    'shoes' => ['pa_size', 'pa_color', 'pa_brand', 'pa_type', 'pa_material'],
    'accessories' => ['pa_color', 'pa_material', 'pa_brand', 'pa_type'],
];

 

Exemplo 4: Loja de Móveis

$filters_map = [
    'bedroom' => ['pa_type', 'pa_material', 'pa_color', 'pa_style', 'pa_size'],
    'living-room' => ['pa_type', 'pa_material', 'pa_color', 'pa_seating-capacity'],
    'office' => ['pa_type', 'pa_material', 'pa_color', 'pa_ergonomic'],
    'outdoor' => ['pa_type', 'pa_material', 'pa_weather-resistant', 'pa_color'],
];

 

Avançado: Incluir Preço e Categorias

Se você quiser exibir faixa de preço e categorias além dos atributos:

// On category pages, add price and allow category drill-down
if (isset($filters_map[$cat])) {
    $taxonomies = implode(',', $filters_map[$cat]);
    return do_shortcode('[woof tax_only="product_cat,' . esc_attr($taxonomies) . '" by_price="1" ajax_redraw="1"]');
}

Explicação dos parâmetros:

  • product_cat – Exibe filtro de categoria para detalhamento
  • by_price="1" – Exibe controle deslizante de faixa de preço
  • ajax_redraw="1" – Atualiza filtros dinamicamente

Solução de Problemas

Filtros não atualizando dinamicamente

Problema: Filtros permanecem estáticos após a seleção
Solução:

  • Certifique-se de que ajax_redraw="1" está no seu shortcode
  • Ative “Redesenho do formulário AJAX” nas configurações do widget
  • Verifique o console JavaScript em busca de erros

Filtros errados aparecendo na categoria

Problema: Categoria exibe conjunto de filtros incorreto
Solução:

  • Verifique se o slug da categoria está correto (confira URL ou configurações da categoria)
  • Use letras minúsculas no array $filters_map
  • Verifique se a categoria existe no seu mapeamento

Filtros não aparecendo

Problema: Nenhum filtro visível na página
Solução:

  • Verifique se os slugs de atributos começam com pa_ (ex.: pa_color não color)
  • Verifique se atributos estão atribuídos a produtos nessa categoria
  • Use [woof] temporariamente para ver se o shortcode básico funciona

Página da Loja exibe filtros de categoria

Problema: Página da Loja mostrando conjunto de filtros errado
Solução:

  • Verifique se a condição is_shop() é a primeira no seu código
  • Verifique se !is_product_category() está incluído
  • Limpe todos os caches (WordPress, servidor, navegador)

Slugs de atributos não funcionando

Problema: Filtros não aparecendo para atributos específicos
Solução:

  • Vá em Produtos → Atributos para encontrar os slugs corretos
  • Lembre-se de usar o prefixo pa_ (requisito do WooCommerce)
  • Verifique a ortografia: pa_colour vs pa_color

Código não funcionando após adicionar

Problema: Tela branca ou erros após adicionar código
Solução:

  • Verifique erros de sintaxe PHP no log de erros
  • Certifique-se de que está editando o functions.php do tema filho
  • Verifique se todos os colchetes e aspas estão fechados
  • Remova o código e adicione novamente linha por linha

Considerações de Desempenho

Impacto do redesenho AJAX:

  • Cada seleção dispara uma requisição AJAX
  • Mais produtos = maior tempo de resposta
  • Solução: Use cache e otimize o banco de dados

Vários widgets vs. shortcode:

  • Widgets: Mais uso de memória (todos os widgets carregam)
  • Shortcode: Mais eficiente (apenas um conjunto carrega)
  • Recomendação: Use a abordagem de shortcode

Catálogos grandes:

  • Considere paginação nos filtros
  • Use carregamento lento para atributos
  • Implemente cache no servidor

Abordagens Alternativas

Usando Vários Shortcodes

Em vez de um shortcode dinâmico, use vários estáticos:

// On wheel category page
[woof tax_only="pa_sub-type,pa_material,pa_colour,pa_size" ajax_redraw="1"]

// On Lingerie category page
[woof tax_only="pa_size,pa_colour,pa_material" ajax_redraw="1"]

// On Shop page
[woof tax_only="product_cat,pa_colour" by_price="1" ajax_redraw="1"]

Em seguida, use Widget Logic para exibir o shortcode correto em cada página.

Usando Arquivos de Modelo

Adicione lógica condicional diretamente no modelo do seu tema:

<?php
if (is_product_category('books')) {
    echo do_shortcode('[woof tax_only="pa_sub-type,pa_material,pa_colour,pa_size"]');
} elseif (is_product_category('lingerie')) {
    echo do_shortcode('[woof tax_only="pa_size,pa_colour,pa_material"]');
} elseif (is_shop()) {
    echo do_shortcode('[woof tax_only="product_cat,pa_colour" by_price="1"]');
} else {
    echo do_shortcode('[woof]');
}
?>

Resumo

Problema: Mesmos filtros aparecem em todos os lugares, poluindo a interface

Solução 1: Habilitar redesenho AJAX para filtros dependentes

Solução 2: Criar shortcode [woof_dynamic] com mapeamento de categoria

Solução 3: Adicionar tratamento da página da Loja com filtros mínimos

Solução 4: Usar Widget Logic para controle avançado de visibilidade

Melhor Abordagem: Combine as Soluções 2 + 3 para filtragem dinâmica abrangente

Código Chave:

add_shortcode('woof_dynamic', function() {
    // Shop page logic
    if (is_shop() AND !is_product_category()) {
        return do_shortcode('[woof tax_only="product_cat" by_price="1"]');
    }
    
    // Category mapping
    $term = get_queried_object();
    if ($term AND $term->taxonomy === 'product_cat') {
        $filters_map = [
            'category-slug' => ['pa_attribute1', 'pa_attribute2'],
        ];
        // Return category-specific filters
    }
    
    return do_shortcode('[woof]'); // Fallback
});

Isso cria uma experiência de filtragem profissional e amigável, adaptada a cada categoria de produto.