Le filtre par catégorie WooCommerce ne retourne aucun résultat : correction de la hiérarchie des catégories
Si le filtre WooCommerce par catégorie ne renvoie aucun résultat pour les catégories parentes, même si des produits sont assignés aux catégories enfants, ce guide vous aidera à résoudre le 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égories :
Federal Actions > SEC > Enforcement - Le produit est assigné à :
Enforcement(catégorie enfant uniquement) - Le filtrage par
Federal ActionsouSECrenvoie : Aucun résultat - Le filtrage par
Enforcementrenvoie : Produit affiché
Pourquoi cela se produit
WordPress/WooCommerce exige que les produits soient explicitement marqués 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. Il s'agit d'une exigence de structure de données, et non d'une limitation de HUSKY.
L'assignation correcte des catégories doit inclure :
- Catégorie enfant :
Enforcement - Catégorie parente :
SEC - Catégorie grand-parent :
Federal Actions
Comment vérifier si vous avez ce problème
- Accédez à la page d'édition d'un produit :
wp-admin/post.php?post=YOUR_PRODUCT_ID&action=edit - Regardez la boîte de métadonnées Catégories sur le côté droit
- Vérifiez si toutes les catégories parentes de la hiérarchie sont cochées
- 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 comprend deux parties :
- Correction pérenne : Marquer automatiquement les catégories parentes lors de l'enregistrement des produits
- Correction immédiate : Normaliser tous les produits existants
Partie 1 : Marquage automatique des catégories parentes (produits futurs)
Ajoutez ce code dans le fichier functions.php de votre thème enfant :
/**
* 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 enregistrement d'un produit
- Récupère 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
- Vide tous les caches pertinents
Résultat : Désormais, tout produit enregistré inclura automatiquement toutes les catégories parentes.
Partie 2 : Normalisation des produits existants (correction unique)
Ce script corrigera tous les produits existants dans votre base de données. Ajoutez ce code temporaire à votre fichier 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 l'utiliser :
- Ajoutez le code à votre fichier
functions.php - Allez sur :
https://yoursite.com/?normalize_cats=1(vous devez être connecté en tant qu'administrateur) - Attendez la fin du script
- Vous verrez les résultats indiquant combien de produits ont été mis à jour
- Supprimez 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 mis en œuvre les deux parties :
- Allez sur votre page boutique avec les filtres HUSKY
- Essayez de filtrer par une catégorie parente
- Les produits des catégories enfants devraient maintenant apparaître
- Essayez de naviguer dans la hiérarchie – tous les niveaux devraient fonctionner
Pourquoi ne pas en faire le comportement par défaut dans HUSKY ?
C'est une question légitime. Voici pourquoi :
- Modification de la structure des données : Cela modifie les relations de données centrales de WooCommerce
- Pas universel : Certains sites assignent intentionnellement uniquement les catégories enfants pour une logique métier spécifique
- Performance : Sur de très grands catalogues, cela ajoute une surcharge à chaque enregistrement de produit
- Conflits : Peut interférer avec d'autres plugins qui gèrent les relations de catégories
Amélioration future : Nous pourrions ajouter cela comme option paramétrable dans HUSKY que les utilisateurs peuvent activer si nécessaire, mais cela ne sera pas le comportement par défaut.
Alternative : Assignation manuelle des catégories
Si vous préférez un contrôle manuel, vous pouvez :
- Modifier chaque produit
- Dans la boîte de métadonnées Catégories, cochez toutes les catégories parentes pertinentes manuellement
- Enregistrez le produit
Cela vous donne un contrôle granulaire mais prend du temps pour les grands catalogues.
Dépannage
Le script affiche 0 produits normalisés
- Vos produits ont peut-être déjà les bonnes catégories parentes assignées
- Vérifiez manuellement quelques produits pour confirmer
Le filtrage ne fonctionne toujours pas après la normalisation
- Videz 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 filtrage
- Vérifiez que les produits sont publiés (pas en brouillon)
Les produits disparaissent du filtre par catégorie enfant
Cela ne devrait pas arriver, mais si cela arrive :
- Le script préserve toutes les assignations de catégories existantes
- Vérifiez si un autre plugin n'interfère pas
- Restaurez à partir d'une sauvegarde et contactez le support
Taxonomies personnalisées
Cette solution fonctionne également pour les taxonomies personnalisées créées avec CPT UI ou des plugins similaires. Remplacez simplement 'product_cat' par le slug de votre 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
- Test sur un site de staging : Testez d'abord sur un site de staging si possible
- Script unique : Supprimez le script de normalisation après l'avoir exécuté
- Conservez le code de la partie 1 : Le hook
save_post_productdoit rester définitivement
Résumé
Ajouter définitivement dans functions.php :
- Hook de marquage automatique des 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 par catégorie enfant continue de fonctionner
- La navigation dans la hiérarchie fonctionne correctement
- Les produits futurs incluent automatiquement les catégories parentes