HUSKY - Products Filter Professional for WooCommerce

Come correggere il filtraggio della gerarchia delle categorie nel negozio WooCommerce (normalizza il db)

Se riscontri problemi in cui il filtraggio per categorie genitore non restituisce risultati, anche se i prodotti sono assegnati a categorie figlio, questa guida ti aiuterà a risolverlo.

Il problema

Sintomo: Quando filtri per categoria padre, non vengono mostrati prodotti, anche se esistono prodotti nelle sue sottocategorie.

Esempio:

  • Struttura delle categorie: Federal Actions > SEC > Enforcement
  • Prodotto è assegnato a: Enforcement (solo categoria figlio)
  • Filtraggio per Federal Actions o SEC restituisce: Nessun risultato
  • Filtraggio per Enforcement restituisce: Prodotto mostrato

Perché succede questo

WordPress/WooCommerce richiede prodotti da contrassegnare esplicitamente con tutte le categorie genitore nella gerarchia, non solo la categoria figlia.

Quando assegni un prodotto a una sottocategoria tramite l'interfaccia di amministrazione di WordPress, WooCommerce non contrassegna automaticamente il prodotto con tutte le categorie genitore nella tabella delle relazioni dei termini. Questo è un requisito della struttura dei dati, non una limitazione di HUSKY.

L'assegnazione corretta della categoria dovrebbe includere:

  • Categoria figlia: Enforcement
  • Categoria genitore: SEC
  • Categoria nonna: Federal Actions

Come Verificare se Hai Questo Problema

  1. Vai a una pagina di modifica prodotto: wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit
  2. Guarda la metabox Categorie sul lato destro
  3. Verifica se tutte le categorie genitore nella gerarchia sono controllati
  4. Se solo la categoria figlio è selezionata → Hai questo problema

Soluzione: Normalizzazione Automatica della Gerarchia delle Categorie

Questa soluzione è composta da due parti:

  1. Correzione a prova di futuro: Segna automaticamente le categorie genitore durante il salvataggio dei prodotti
  2. Correzione immediata: Normalizza tutti i prodotti esistenti

Parte 1: Auto-Marca Categorie Genitore (Prodotti Futuri)

Aggiungi questo codice al tuo child theme’s functions.php:

/**
 * 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 questo:

  • Si attiva ogni volta che un prodotto viene salvato
  • Recupera tutte le categorie assegnate
  • Trova tutte le categorie genitore per ogni categoria assegnata
  • Contraddistingue il prodotto con la gerarchia completa
  • Cancella tutte le cache pertinenti

Risultato: D'ora in poi, ogni prodotto salvato includerà automaticamente tutte le categorie genitore.

Parte 2: Normalizza Prodotti Esistenti (Correzione Una Tantum)

Questo script correggerà tutti i prodotti esistenti nel tuo database. Aggiungi questo temporaneo codice 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 usare:

  1. Aggiungi il codice al tuo functions.php
  2. Vai a: https://yoursite.com/?normalize_cats=1 (è necessario accedere 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 non avevano categorie genitore e sono stati corretti.

Test della correzione

Dopo aver implementato entrambe le parti:

  1. Vai alla tua pagina del negozio con i filtri HUSKY
  2. Prova a filtrare per un categoria genitore
  3. Dovrebbero ora apparire prodotti dalle categorie figlio
  4. Prova a scendere nella gerarchia – tutti i livelli dovrebbero funzionare

Perché non renderlo predefinito in HUSKY?

Questa è una domanda legittima. Ecco perché:

  1. Modifica della struttura dei dati: Questo modifica le relazioni dei dati principali di WooCommerce
  2. Non universale: Alcuni siti assegnano intenzionalmente solo categorie figlie per una specifica logica di business
  3. Performance: Su cataloghi molto grandi, questo aggiunge un overhead ad ogni salvataggio del prodotto
  4. Conflitti: Può interferire con altri plugin che gestiscono le relazioni tra le categorie

Miglioramento futuro: Potremmo aggiungere questo 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. Modifica ogni prodotto
  2. Nella metabox Categorie, seleziona tutte le categorie genitore pertinenti manualmente
  3. Salva il prodotto

Questo ti dà un controllo granulare ma richiede tempo per cataloghi di grandi dimensioni.

Risoluzione dei problemi

Lo script mostra 0 prodotti normalizzati

  • I tuoi prodotti potrebbero avere già assegnate le categorie genitore corrette
  • Controlla manualmente alcuni prodotti per verificare

Il filtraggio non funziona ancora dopo la normalizzazione

  • Cancella tutte le cache (WordPress, server, browser)
  • Assicurati che HUSKY stia usando la tassonomia corretta (product_cat)
  • Verifica conflitti con altri plugin di filtro
  • Verifica che i prodotti siano pubblicati (non bozze)

I prodotti scompaiono dal filtro della categoria figlia

Questo non dovrebbe succedere, ma se succede:

  • Lo script preserva tutte le assegnazioni di categoria esistenti
  • Verifica se un altro plugin sta interferendo
  • Ripristina dal backup e contatta il supporto

Tassonomie personalizzate

Questa soluzione funziona anche per tassonomie personalizzate creato con CPT UI o plugin simili. Cambia semplicemente 'product_cat' al tuo slug di 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 Child Richiesto: Utilizza sempre un tema figlio per evitare la perdita di codice durante gli aggiornamenti del tema
  • Backup prima: Esegui il backup del tuo database prima di eseguire lo script di normalizzazione
  • Test su Staging: Testa prima su un sito di staging, se possibile
  • Script One-Time: Rimuovi lo script di normalizzazione dopo averlo eseguito
  • Mantieni il codice della Parte 1: Il save_post_product hook dovrebbe rimanere permanentemente

Sommario

Aggiungi a functions.php in modo permanente:

  • Hook per contrassegnare automaticamente le categorie genitrici (Parte 1)

Esegui una volta e rimuovi:

  • Script di normalizzazione (Parte 2)

Risultati attesi:

  • Il filtraggio della categoria genitore funziona correttamente
  • Il filtraggio delle categorie figlie continua a funzionare
  • Le funzioni di gerarchia di drill-down funzionano correttamente
  • I prodotti futuri includono automaticamente le categorie genitore