Come Mostrare Filtri Diversi per Categoria in WOOF (Filtraggio Dinamico)
Scopri come visualizzare diversi set di filtri in base alle categorie di prodotti, creare filtri dipendenti e personalizzare i filtri per la pagina Shop di WooCommerce.
Il problema
Per impostazione predefinita, WOOF mostra gli stessi filtri su tutte le pagine. Tuttavia, diverse categorie di prodotti spesso necessitano di diverse opzioni di filtro:
Scenari di esempio:
- Categoria Elettronica: Mostra Marca, Dimensione Schermo, Memoria, RAM
- Categoria abbigliamento: Mostra Taglia, Colore, Materiale, Stile
- Categoria Mobili: Mostra Materiale, Colore, Dimensioni, Tipo di stanza
- Pagina Negozio (archivio principale): Mostra solo Categorie, Intervallo di prezzi, Marche in evidenza
Limitazione attuale: Tutte le opzioni di filtro rimangono globali, anche dopo che un utente seleziona una categoria, rendendo l'interfaccia disordinata con filtri irrilevanti.
Cosa imparerai:
- Come abilitare il filtraggio dipendente/condizionale (i filtri si aggiornano in base alla selezione)
- Come mostrare filtri diversi per categoria di prodotto
- Come creare set di filtri personalizzati per la pagina Negozio
- Come utilizzare Widget Logic per un controllo avanzato della visibilità
Soluzione 1: Abilita Filtraggio Dipendente (AJAX Redraw)
Il primo passo è abilitare il ridisegno del modulo AJAX, che aggiorna dinamicamente i filtri quando gli utenti effettuano selezioni.
Per Widget:
- Vai su Aspetto → Widget
- Trova il tuo widget WOOF
- Abilita l'opzione “Ridisegno AJAX del modulo”
Ciò rende i filtri si aggiornano automaticamente dopo ogni selezione, mostrando solo le opzioni pertinenti.
Per Shortcodes:
Aggiungi il ajax_redraw attributo al tuo shortcode WOOF:
[woof ajax_redraw="1"]
Cosa fa questo:
- Quando l'utente seleziona "Ruota" → gli altri filtri si aggiornano automaticamente
- Mostra solo tipi, materiali, colori disponibili per ruota
- Riduce il disordine nascondendo le opzioni irrilevanti
Documentazione: https://products-filter.com/shortcode/woof
Soluzione 2: Visibilità Filtro Basato su Categoria (Shortcode Personalizzato)
Questa soluzione crea uno shortcode dinamico che visualizza filtri diversi a seconda della categoria di prodotti corrente.
Passaggio 1: Crea uno Shortcode personalizzato
Aggiungi questo codice al tuo child theme’s functions.php:
/**
* 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"]');
});
Passaggio 2: Usa lo Shortcode
Sostituisci il tuo esistente [woof] shortcode con:
[woof_dynamic]
Posiziona questo shortcode in:
- Aree widget (widget Testo/HTML)
- Blocchi di page builder (Elementor, Divi, ecc.)
- File del modello del tema:
<?php echo do_shortcode('[woof_dynamic]'); ?>
Passaggio 3: Configura le tue categorie
Aggiorna il $filters_map array con i tuoi reali:
- Slug delle categorie (es. ‘ruota’, ‘elettronica’)
- Slug degli attributi (es. ‘pa_brand’, ‘pa_size’)
Trovare i tuoi slug:
Slug delle categorie:
- Vai su Prodotti → Categorie
- Passa il mouse sopra il nome di una categoria
- Guarda l'URL:
...tag_ID=123&taxonomy=product_cat&post_type=product - Oppure modifica la categoria e guarda il campo slug
Slug degli attributi:
- Vai su Prodotti → Attributi
- Iniziano con
pa_seguito dal nome dell'attributo - Esempi:
pa_color,pa_size,pa_brand,pa_material
Soluzione 3: Filtri personalizzati per la pagina Negozio
La pagina principale del negozio WooCommerce richiede una gestione diversa poiché non è un archivio di categoria.
Soluzione combinata: Pagine Negozio + Pagine Categoria
Questo codice gestisce sia la pagina Negozio che le singole pagine di categoria:
/**
* 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"]');
});
Cosa fa questo codice:
- Nella pagina Negozio: Mostra solo filtri Categorie, Colore e Prezzo
- Nelle pagine categoria: Mostra i filtri specifici della categoria dalla mappatura
- Su altre pagine: Mostra i filtri predefiniti
Personalizza i filtri della pagina Negozio: Modifica questa riga per mostrare filtri diversi sulla pagina Negozio:
[woof tax_only="product_cat,pa_colour" by_price="1" ajax_redraw="1"]
Parametri disponibili:
tax_only="product_cat,pa_brand"– Mostra solo queste tassonomieby_price="1"– Mostra filtro range di prezzoby_only="product_cat,pa_brand"- Alternativa a tax_onlyajax_redraw="1"– Abilita gli aggiornamenti dinamici
Soluzione 4: Widget Logic per la Visibilità Condizionale
Se preferisci usare i widget invece degli shortcode, puoi controllare la visibilità dei widget con la logica condizionale.
Passaggio 1: Installa il Plugin Widget Logic
Scegli uno di questi plugin:
- Logica del widget: https://wordpress.org/plugins/widget-logic/
- Mostra Widget per Logica: https://github.com/realmag777/Show-WordPress-Widget-by-Logic
Passaggio 2: Crea più widget WOOF
- Vai su Aspetto → Widget
- Aggiungi più widget WOOF alla tua sidebar
- Configura ogni widget con filtri diversi
Passo 3: Aggiungi logica condizionale
Per ogni widget, aggiungi condizioni di visibilità:
Mostra solo nella categoria Ruota:
is_product_category('wheel')
Mostra solo nella categoria Lingerie:
is_product_category('lingerie')
Mostra solo nella pagina Negozio:
is_shop() AND !is_product_category()
Mostra su più categorie:
is_product_category(array('wheel', 'lingerie', 'massage-candles'))
Mostra ovunque tranne la pagina Negozio:
!is_shop()
Mostra su categorie Elettronica o Computer:
is_product_category('electronics') || is_product_category('computers')
Esempi reali
Esempio 1: Negozio Prodotti per Adulti
$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'],
];
Esempio 2: Negozio di Elettronica
$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'],
];
Esempio 3: Negozio di 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'],
];
Esempio 4: Negozio di Mobili
$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'],
];
Avanzate: includi prezzo e categorie
Se vuoi mostrare range di prezzo e categorie oltre agli attributi:
// 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"]');
}
Spiegazione dei parametri:
product_cat– Mostra il filtro delle categorie per il drill-downby_price="1"– Mostra lo slider del range di prezzoajax_redraw="1"– Aggiorna i filtri dinamicamente
Risoluzione dei problemi
I filtri non si aggiornano dinamicamente
Problema: I filtri rimangono statici dopo la selezione
Soluzione:
- Assicurati
ajax_redraw="1"è presente nel tuo shortcode - Abilita "Disegno AJAX del modulo" nelle impostazioni del widget
- Controlla la console JavaScript per errori
Filtri errati visualizzati sulla categoria
Problema: La categoria mostra un filtro impostato in modo errato
Soluzione:
- Verifica che lo slug della categoria sia corretto (controlla l'URL o le impostazioni della categoria)
- Usa minuscolo in
$filters_maparray - Verifica se la categoria esiste nella tua mappatura
I filtri non appaiono affatto
Problema: Nessun filtro visibile sulla pagina
Soluzione:
- Verifica che gli slug degli attributi inizino con
pa_(es.pa_colornocolor) - Verifica se gli attributi sono assegnati ai prodotti in quella categoria
- Usa
[woof]temporaneamente per vedere se lo shortcode di base funziona
La pagina del negozio mostra i filtri per categoria
Problema: La pagina dello shop mostra un set di filtri errato
Soluzione:
- Verifica
is_shop()la condizione è per prima nel tuo codice - Controlla questo
!is_product_category()è incluso - Cancella tutte le cache (WordPress, server, browser)
I slug degli attributi non funzionano
Problema: I filtri non vengono visualizzati per attributi specifici
Soluzione:
- Vai su Prodotti → Attributi per trovare gli slug corretti
- Ricorda di usare
pa_prefisso (requisito WooCommerce) - Controlla l’ortografia:
pa_colourvspa_color
Il codice non funziona dopo l'aggiunta
Problema: Schermata bianca o errori dopo l'aggiunta di codice
Soluzione:
- Controlla errori di sintassi PHP nel log degli errori
- Assicurati di modificare il functions.php del tema figlio
- Verifica che tutte le parentesi e le virgolette siano chiuse
- Rimuovi codice e aggiungilo nuovamente riga per riga
Considerazioni sulle prestazioni
Impatto ridisegno AJAX:
- Ogni selezione attiva una richiesta AJAX
- Più prodotti = tempo di risposta più lungo
- Soluzione: Usa la cache e ottimizza il database
Widget multipli vs. shortcode:
- Widget: Più utilizzo di memoria (tutti i widget vengono caricati)
- Shortcode: Più efficiente (viene caricato un solo set)
- Raccomandazione: Usa l'approccio shortcode
Cataloghi di grandi dimensioni:
- Considera la paginazione nei filtri
- Usa il caricamento pigro per gli attributi
- Implementa la cache lato server
Approcci Alternativi
Utilizzo di Shortcode multipli
Invece di un singolo shortcode dinamico, usane multipli statici:
// 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"]
Quindi usa Widget Logic per mostrare lo shortcode corretto su ogni pagina.
Utilizzo di file di template
Aggiungi logica condizionale direttamente nel template del tuo 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]');
}
?>
Sommario
Problema: Stessi filtri ovunque, interfacciaincompleta
Soluzione 1: Abilita il ridisegno AJAX per il filtraggio dipendente
Soluzione 2: Crea [woof_dynamic] shortcode con mappatura categorie
Soluzione 3: Aggiungi gestione della pagina negozio con filtri minimi
Soluzione 4: Usa Widget Logic per un controllo avanzato della visibilità
Miglior approccio: Combina le Soluzioni 2 + 3 per un filtraggio dinamico completo
Codice tasto:
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
});
Questo crea un'esperienza di filtraggio professionale e user-friendly, su misura per ogni categoria di prodotto.