HUSKY - Products Filter Professional for WooCommerce

Comment corriger le filtrage de la hiérarchie des catégories dans la boutique woocommerce (normaliser la base de données)

Si vous rencontrez des problèmes où le filtrage par catégories parentes ne renvoie aucun résultat, même si des produits sont assignés à des catégories enfants, ce guide vous aidera à résoudre ce problème.

Le problème

Symptôme : Lorsque vous filtrez par une catégorie parente, aucun produit n'est affiché, même si des produits existent dans ses catégories enfants.

Exemple :

  • Structure de catégorie : Federal Actions > SEC > Enforcement
  • Le produit est attribué à : Enforcement (catégorie enfant uniquement)
  • Filtrage par Federal Actions ou SEC renvoie : Aucun résultat
  • Filtrage par Enforcement renvoie : Produit affiché

Pourquoi cela se produit

WordPress/WooCommerce requiert les produits à marquer explicitement avec toutes les catégories parentes dans la hiérarchie, pas seulement la catégorie enfant.

Lorsque vous assignez un produit à une catégorie enfant via l'interface d'administration WordPress, WooCommerce ne marque pas automatiquement le produit avec toutes les catégories parentes dans la table des relations de termes. C'est une exigence de la structure des données, pas une limitation de HUSKY.

L'affectation correcte de la catégorie devrait inclure :

  • Catégorie enfant : Enforcement
  • Catégorie parente : SEC
  • Catégorie grand-parent : Federal Actions

Comment vérifier si vous avez ce problème

  1. Accédez à la page de modification d'un produit : wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit
  2. Regardez la boîte méta Catégories sur le côté droit
  3. Vérifiez si toutes les catégories parentes dans la hiérarchie sont cochés
  4. Si seule la catégorie enfant est cochée → Vous avez ce problème

Solution : Normalisation automatique de la hiérarchie des catégories

Cette solution se compose de deux parties :

  1. Correction pérenne: marquer automatiquement les catégories parentes lors de la sauvegarde des produits
  2. Correction immédiate: Normaliser tous les produits existants

Partie 1 : Marquer automatiquement les catégories parentes (Produits futurs)

Ajoutez ce code à votre thème enfant ‘ 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);
        }
    }
}

Ce que cela fait :

  • Se déclenche chaque fois qu'un produit est enregistré
  • Obtient toutes les catégories assignées
  • Trouve toutes les catégories parentes pour chaque catégorie assignée
  • Marque le produit avec la hiérarchie complète
  • Efface tous les caches pertinents

Résultat : Désormais, tout produit enregistré inclura automatiquement toutes les catégories parentes.

Partie 2 : Normaliser les produits existants (Correction unique)

Ce script corrigera tous les produits existants dans votre base de données. Ajoutez ceci temporaire code dans votre 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
    ];
}

Comment utiliser :

  1. Ajoutez le code à votre functions.php
  2. Aller à : https://yoursite.com/?normalize_cats=1 (doit être connecté en tant qu'administrateur)
  3. Attendre la fin du script
  4. Vous verrez des résultats montrant combien de produits ont été mis à jour
  5. Supprimer ce code après l'avoir exécuté une fois

Sortie attendue :

Category Normalization Results
Array
(
    [success] => 1
    [normalized] => 156
    [total] => 919
)

Cela signifie que 156 produits sur 919 avaient des catégories parentes manquantes et ont été corrigés.

Tester la correction

Après avoir implémenté les deux parties :

  1. Allez sur votre page boutique avec les filtres HUSKY
  2. Essayez de filtrer par un catégorie parente
  3. Les produits des catégories enfants devraient maintenant apparaître
  4. Essayez de descendre dans la hiérarchie – tous les niveaux devraient fonctionner

Pourquoi ne pas faire de cela la valeur par défaut dans HUSKY ?

C'est une question légitime. Voici pourquoi :

  1. Changement de structure de données: Ceci modifie les relations de données de base de WooCommerce
  2. Non universel: Certains sites attribuent intentionnellement uniquement les catégories enfants pour une logique commerciale spécifique
  3. Performance: Sur les très grands catalogues, cela ajoute une surcharge à chaque enregistrement de produit
  4. Conflits: Peut interférer avec d'autres plugins qui gèrent les relations de catégories

Amélioration future: Nous pourrions ajouter ceci comme une réglage optionnel dans HUSKY que les utilisateurs peuvent activer si nécessaire, mais ce ne sera pas le comportement par défaut.

Alternative : Attribution manuelle de catégorie

Si vous préférez un contrôle manuel, vous pouvez :

  1. Modifier chaque produit
  2. Dans la boîte méta Catégories, cochez toutes les catégories parentes pertinentes manuellement
  3. Enregistrer le produit

Cela vous donne un contrôle granulaire mais est chronophage pour les grands catalogues.

Dépannage

Le script affiche 0 produits normalisés

  • Vos produits ont peut-être déjà des catégories parentes correctement attribuées
  • Vérifiez quelques produits manuellement pour confirmer

Le filtrage ne fonctionne toujours pas après la normalisation

  • Effacer tous les caches (WordPress, serveur, navigateur)
  • Assurez-vous que HUSKY utilise la taxonomie correcte (product_cat)
  • Vérifiez les conflits avec d'autres plugins de filtre
  • Vérifiez que les produits sont publiés (pas en brouillon)

Les produits disparaissent du filtre de catégorie enfant

Cela ne devrait pas arriver, mais si cela arrive :

  • Le script préserve toutes les affectations de catégories existantes
  • Vérifiez si un autre plugin interfère
  • Restaurer à partir de la sauvegarde et contacter le support

Taxonomies personnalisées

Cette solution fonctionne également pour taxonomies personnalisées créé avec CPT UI ou des plugins similaires. Changez simplement 'product_cat' à votre slug de taxonomie personnalisée :

// 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');

Notes importantes

  • Thème enfant requis: Utilisez toujours un thème enfant pour éviter la perte de code lors des mises à jour du thème
  • Sauvegarde d'abord: Sauvegardez votre base de données avant d'exécuter le script de normalisation
  • Tester sur Staging: Testez d’abord sur un site de staging si possible
  • Script unique: Supprimer le script de normalisation après son exécution
  • Conserver le code de la partie 1: Le save_post_product hook doit rester en permanence

Résumé

Ajouter à functions.php de manière permanente :

  • Crochet pour marquer automatiquement les catégories parentes (Partie 1)

Exécuter une fois et supprimer :

  • Script de normalisation (Partie 2)

Résultats attendus:

  • Le filtrage par catégorie parente fonctionne correctement
  • Le filtrage des catégories enfants continue de fonctionner
  • Les fonctions de la hiérarchie se déroulent correctement
  • Les futurs produits incluent automatiquement les catégories parentes