Filtro WooCommerce per categoria non restituisce risultati: correzione della gerarchia delle categorie
Se il filtro WooCommerce per categoria non restituisce risultati per le categorie padre, anche se i prodotti sono assegnati a categorie figlie, questa guida ti aiuterà a risolvere il problema.
Il Problema
Sintomo: Quando filtri per una categoria padre, non vengono mostrati prodotti, anche se esistono prodotti nelle sue categorie figlie.
Esempio:
- Struttura delle categorie:
Federal Actions > SEC > Enforcement - Il prodotto è assegnato a:
Enforcement(solo categoria figlia) - Filtrando per
Federal ActionsoSECrestituisce: Nessun risultato - Filtrando per
Enforcementrestituisce: Prodotto mostrato
Perché Succede
WordPress/WooCommerce richiede che i prodotti siano esplicitamente contrassegnati con tutte le categorie padre nella gerarchia, non solo la categoria figlia.
Quando assegni un prodotto a una categoria figlia tramite l'interfaccia di amministrazione di WordPress, WooCommerce non contrassegna automaticamente il prodotto con tutte le categorie padre nella tabella delle relazioni dei termini. Questo è un requisito strutturale dei dati, non un limite di HUSKY.
L'assegnazione corretta delle categorie dovrebbe includere:
- Categoria figlia:
Enforcement - Categoria padre:
SEC - Categoria nonno:
Federal Actions
Come Verificare se Hai Questo Problema
- Vai alla pagina di modifica di un prodotto:
wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit - Guarda il riquadro "Categorie" sul lato destro
- Controlla se tutte le categorie padre nella gerarchia sono selezionate
- Se è selezionata solo la categoria figlia → Hai questo problema
Soluzione: Normalizzazione Automatica della Gerarchia delle Categorie
Questa soluzione è composta da due parti:
- Correzione a prova di futuro: Contrassegna automaticamente le categorie padre durante il salvataggio dei prodotti
- Correzione immediata: Normalizza tutti i prodotti esistenti
Parte 1: Contrassegno Automatico delle Categorie Padre (Prodotti Futuri)
Aggiungi questo codice al functions.php del tuo tema figlio:
/**
* Automatically mark all parent categories when product is saved
* This ensures hierarchy filtering works correctly
*/
add_action('save_post_product', 'auto_mark_parent_categories', 10, 1);
function auto_mark_parent_categories($product_id) {
// Clear cache
clean_object_term_cache($product_id, 'product_cat');
// Get currently assigned categories
$terms = wp_get_post_terms($product_id, 'product_cat', ['fields' => 'ids']);
if (!is_wp_error($terms) AND !empty($terms)) {
$all_terms = [];
// For each assigned category, get all its parents
foreach ($terms as $term_id) {
$all_terms[] = $term_id;
// Get all ancestor categories
$ancestors = get_ancestors($term_id, 'product_cat', 'taxonomy');
if (!empty($ancestors)) {
$all_terms = array_merge($all_terms, $ancestors);
}
}
// Assign product to all categories including parents
wp_set_object_terms($product_id, array_unique($all_terms), 'product_cat');
// Clear caches
clean_post_cache($product_id);
clean_object_term_cache($product_id, 'product_cat');
if (function_exists('wc_delete_product_transients')) {
wc_delete_product_transients($product_id);
}
}
}
Cosa fa:
- Si attiva ogni volta che un prodotto viene salvato
- Recupera tutte le categorie assegnate
- Trova tutte le categorie padre per ogni categoria assegnata
- Contrassegna il prodotto con la gerarchia completa
- Pulisce tutte le cache pertinenti
Risultato: D'ora in poi, qualsiasi prodotto salvato includerà automaticamente tutte le categorie padre.
Parte 2: Normalizzare i Prodotti Esistenti (Correzione Una Tantum)
Questo script correggerà tutti i prodotti esistenti nel tuo database. Aggiungi questo codice temporaneo al tuo functions.php:
/**
* One-time script to normalize all existing products
* Access: yourdomain.com/?normalize_cats=1 (must be logged in as admin)
*/
add_action('init', function () {
if (isset($_GET['normalize_cats']) AND current_user_can('manage_options')) {
$result = normalize_all_products_categories();
echo '<h2>Category Normalization Results</h2>';
echo '<pre>';
print_r($result);
echo '</pre>';
die();
}
});
function normalize_all_products_categories() {
global $wpdb;
// Get all product IDs
$args = [
'post_type' => 'product',
'post_status' => 'any',
'posts_per_page' => -1,
'fields' => 'ids'
];
$product_ids = get_posts($args);
$log = [];
$normalized_count = 0;
foreach ($product_ids as $product_id) {
// Get current categories
$terms = wp_get_post_terms($product_id, 'product_cat', ['fields' => 'ids']);
if (!is_wp_error($terms) AND !empty($terms)) {
$all_terms = [];
// Collect all parent categories
foreach ($terms as $term_id) {
$all_terms[] = $term_id;
// Get ancestors
$ancestors = get_ancestors($term_id, 'product_cat', 'taxonomy');
if (!empty($ancestors)) {
$all_terms = array_merge($all_terms, $ancestors);
}
}
$all_terms = array_unique($all_terms);
// Only update if we're adding new parent categories
if (count($all_terms) > count($terms)) {
wp_set_object_terms($product_id, $all_terms, 'product_cat');
$normalized_count++;
$log[] = "Product #{$product_id}: added " . (count($all_terms) - count($terms)) . " parent categories";
}
}
}
// Log to WordPress error log
error_log("=== Category Normalization Complete ===");
error_log(implode("\n", $log));
error_log("Total normalized: {$normalized_count} products");
return [
'success' => true,
'normalized' => $normalized_count,
'total' => count($product_ids),
'details' => $log
];
}
Come usarlo:
- Aggiungi il codice al tuo
functions.php - Vai a:
https://yoursite.com/?normalize_cats=1(devi essere autenticato come amministratore) - Attendi il completamento dello script
- Vedrai i risultati che mostrano quanti prodotti sono stati aggiornati
- Rimuovi questo codice dopo averlo eseguito una volta
Output previsto:
Category Normalization Results
Array
(
[success] => 1
[normalized] => 156
[total] => 919
)
Ciò significa che 156 prodotti su 919 mancavano di categorie padre e sono stati corretti.
Verifica della Correzione
Dopo aver implementato entrambe le parti:
- Vai alla pagina del tuo negozio con i filtri HUSKY
- Prova a filtrare per una categoria padre
- I prodotti delle categorie figlie dovrebbero ora apparire
- Prova a navigare nella gerarchia: tutti i livelli dovrebbero funzionare
Perché Non Renderlo Predefinito in HUSKY?
Questa è una domanda legittima. Ecco il perché:
- Modifica della Struttura Dati: Modifica le relazioni dati principali di WooCommerce
- Non Universale: Alcuni siti assegnano intenzionalmente solo categorie figlie per specifiche logiche di business
- Prestazioni: Su cataloghi molto grandi, aggiunge un sovraccarico a ogni salvataggio di prodotto
- Conflitti: Potrebbe interferire con altri plugin che gestiscono le relazioni tra categorie
Miglioramento Futuro: Potremmo aggiungere questa funzionalità come impostazione opzionale in HUSKY che gli utenti possono abilitare se necessario, ma non sarà il comportamento predefinito.
Alternativa: Assegnazione Manuale delle Categorie
Se preferisci il controllo manuale, puoi:
- Modificare ogni prodotto
- Nel riquadro "Categorie", seleziona manualmente tutte le categorie padre pertinenti
- Salvare il prodotto
Questo ti dà un controllo granulare, ma richiede tempo per cataloghi grandi.
Risoluzione dei Problemi
Lo script mostra 0 prodotti normalizzati
- I tuoi prodotti potrebbero già avere le categorie padre corrette assegnate
- Controlla manualmente alcuni prodotti per verificare
Il filtro ancora non funziona dopo la normalizzazione
- Cancella tutte le cache (WordPress, server, browser)
- Assicurati che HUSKY stia usando la tassonomia corretta (
product_cat) - Controlla la presenza di conflitti con altri plugin di filtri
- Verifica che i prodotti siano pubblicati (non bozze)
I prodotti scompaiono dal filtro per categoria figlia
Questo non dovrebbe accadere, ma se succede:
- Lo script preserva tutte le assegnazioni di categorie esistenti
- Controlla se un altro plugin sta interferendo
- Ripristina da un backup e contatta il supporto
Tassonomie Personalizzate
Questa soluzione funziona anche per tassonomie personalizzate create con CPT UI o plugin simili. Basta cambiare 'product_cat' con lo slug della tua tassonomia personalizzata:
// Example for custom taxonomy 'modality'
$terms = wp_get_post_terms($product_id, 'modality', ['fields' => 'ids']);
wp_set_object_terms($product_id, array_unique($all_terms), 'modality');
Note Importanti
- Tema Figlio Obbligatorio: Usa sempre un tema figlio per evitare la perdita del codice durante gli aggiornamenti del tema
- Prima il Backup: Fai un backup del database prima di eseguire lo script di normalizzazione
- Test su Staging: Se possibile, testa su un sito di staging prima
- Script Una Tantum: Rimuovi lo script di normalizzazione dopo averlo eseguito
- Mantieni il Codice della Parte 1: L'hook
save_post_productdovrebbe rimanere permanentemente
Riepilogo
Aggiungere a functions.php permanentemente:
- Hook per contrassegno automatico delle categorie padre (Parte 1)
Eseguire una volta e rimuovere:
- Script di normalizzazione (Parte 2)
Risultati previsti:
- Il filtro per categoria padre funziona correttamente
- Il filtro per categoria figlia continua a funzionare
- La navigazione gerarchica funziona correttamente
- I prodotti futuri includono automaticamente le categorie padre