HUSKY - Product Filter for WooCommerce

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 Actions o SEC restituisce: Nessun risultato
  • Filtrando per Enforcement restituisce: 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

  1. Vai alla pagina di modifica di un prodotto: wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit
  2. Guarda il riquadro "Categorie" sul lato destro
  3. Controlla se tutte le categorie padre nella gerarchia sono selezionate
  4. Se è selezionata solo la categoria figlia → Hai questo problema

Soluzione: Normalizzazione Automatica della Gerarchia delle Categorie

Questa soluzione è composta da due parti:

  1. Correzione a prova di futuro: Contrassegna automaticamente le categorie padre durante il salvataggio dei prodotti
  2. 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:

  1. Aggiungi il codice al tuo functions.php
  2. Vai a: https://yoursite.com/?normalize_cats=1 (devi essere autenticato come amministratore)
  3. Attendi il completamento dello script
  4. Vedrai i risultati che mostrano quanti prodotti sono stati aggiornati
  5. 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:

  1. Vai alla pagina del tuo negozio con i filtri HUSKY
  2. Prova a filtrare per una categoria padre
  3. I prodotti delle categorie figlie dovrebbero ora apparire
  4. Prova a navigare nella gerarchia: tutti i livelli dovrebbero funzionare

Perché Non Renderlo Predefinito in HUSKY?

Questa è una domanda legittima. Ecco il perché:

  1. Modifica della Struttura Dati: Modifica le relazioni dati principali di WooCommerce
  2. Non Universale: Alcuni siti assegnano intenzionalmente solo categorie figlie per specifiche logiche di business
  3. Prestazioni: Su cataloghi molto grandi, aggiunge un sovraccarico a ogni salvataggio di prodotto
  4. 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:

  1. Modificare ogni prodotto
  2. Nel riquadro "Categorie", seleziona manualmente tutte le categorie padre pertinenti
  3. 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_product dovrebbe 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