HUSKY - WooCommerce Product Filter Professional

Filtre WooCommerce : n’afficher que les attributs de la catégorie actuelle

Lorsque plusieurs catégories de produits partagent un même attribut, un filtre WooCommerce propose souvent des valeurs qui n’ont aucun sens sur la page : Gril sous les réfrigérateurs, 512 Go sous les casques audio, des marques qui ne sont pas vendues dans cette catégorie. Un clic sur ces valeurs donne un résultat vide. Pour que le filtre WooCommerce n’affiche que les attributs de la catégorie actuelle, HUSKY compte les produits associés à chaque terme de la page et masque les termes dont le compteur est à zéro. Voici comment cela fonctionne, les réglages exacts, comment garder les nombres invisibles, et les cas où la catégorie n’est tout simplement pas connue.

Comment le filtre sait ce qui appartient à la catégorie actuelle

Sur une page de catégorie de produits, et sur toute autre archive de taxonomie de produits (une étiquette, une archive d’attribut, une marque), HUSKY mémorise le terme que la page affiche. Avec Recomptage dynamique (Dynamic recount) activé, le nombre à côté de chaque terme du filtre est calculé ainsi : produits de cette catégorie qui correspondent à tout ce que le visiteur a déjà sélectionné et qui possèdent aussi ce terme. Une valeur qu’aucun produit de la catégorie ne possède obtient 0.

Masquer les termes vides (Hide empty terms) retire ensuite du formulaire chaque terme à 0. Lorsque tous les termes d’une section sont retirés, la section entière, titre compris, disparaît elle aussi : un attribut qui n’est pas utilisé dans la catégorie s’efface donc de la barre latérale. La section des catégories elle‑même est réduite aux sous‑catégories de la catégorie consultée ; pourquoi le filtre n’affiche que les sous‑catégories explique ce point et ses exceptions.

Rien n’est à configurer par catégorie. Le même formulaire, placé dans une barre latérale ou dans le modèle de catégorie, s’adapte tout seul à chaque page de catégorie.

Les trois réglages qui masquent les termes vides

Ouvrez les réglages du plugin, onglet Options, et définissez :

  1. Afficher le compteur (Show count) : Oui
  2. Recomptage dynamique (Dynamic recount) : Oui
  3. Masquer les termes vides (Hide empty terms) : Oui

Enregistrez, puis videz tous les caches susceptibles de conserver d’anciens compteurs : Mettre en cache le nombre du recomptage dynamique pour chaque élément du filtre (Cache dynamic recount number for each item in filter) et Cache des termes (Cache terms) dans Avancé → Options (Advanced → Options) si vous les utilisez, ainsi que le cache de pages de votre site.

Les trois options dépendent l’une de l’autre, et la page de réglages l’impose : un terme vide ne peut être repéré qu’en comptant. Activer Masquer les termes vides (Hide empty terms) active aussi les deux autres, et désactiver Afficher le compteur (Show count) désactive aussi les deux autres. Si vous réglez Afficher le compteur (Show count) sur Non pour supprimer les nombres, les termes vides reviennent sur toutes les pages. Les combinaisons possibles :

Afficher le compteur / Recomptage dynamique / Masquer les termes videsCe que voient les visiteurs
Non / Non / NonTous les termes, sans nombres
Oui / Non / NonNombres pour l’ensemble de la boutique ; les termes sans aucun produit sont grisés
Oui / Oui / NonNombres pour la catégorie et la sélection en cours ; les termes à zéro restent visibles mais grisés et ne peuvent pas être sélectionnés
Oui / Oui / OuiLes termes à zéro sont masqués ; les sections vides disparaissent

La troisième ligne est le bon choix si vous préférez présenter les valeurs indisponibles comme inactives plutôt que de les retirer. Quelques autres endroits peuvent supplanter les options globales :

  • Dans la version gratuite, Masquer les termes vides (Hide empty terms) et Masquer le texte du compteur des termes (Hide terms count text) (voir plus bas) sont grisés ; ils font partie de la version premium.
  • Le widget de filtre HUSKY a son propre champ Recomptage dynamique (Dynamic recount) (Par défaut (Default), Non (No), Oui (Yes)). S’il est réglé sur Non (No), ce widget ignore le réglage global. Le shortcode [woof] dispose du même interrupteur sous la forme dynamic_recount=1 ou dynamic_recount=0.
  • Lorsque le mode Turbo est activé, l’onglet Options affiche des copies distinctes de ces trois réglages pour le mode Turbo. Définissez‑les à nouveau après l’avoir activé.
  • Une taxonomie affichée sous forme de curseur de plage n’est pas recomptée par les options globales. Ouvrez ses options supplémentaires (l’icône d’engrenage à côté de la taxonomie dans l’onglet Structure) et réglez Activer le recomptage dynamique (Enable dynamic recount) sur Oui ; les valeurs sans produits sont alors exclues de l’échelle du curseur.

La documentation de l’onglet Options décrit les autres réglages de cet écran.

Masquer les termes vides sans afficher le compteur

Le souhait le plus courant est de masquer les termes vides sans imprimer de nombres comme (12). Gardez les trois options activées et allez dans Avancé → Options (Advanced → Options) : réglez Masquer le texte du compteur des termes (Hide terms count text) sur Oui. Le plugin calcule toujours les compteurs, dont il a besoin pour savoir ce qui est vide, mais ne les affiche pas. Pour ne le faire que sur un seul formulaire, ajoutez hide_terms_count=1 à son shortcode, par exemple [woof hide_terms_count=1].

Masquer le compteur avec du CSS fonctionne aussi pour les cases à cocher et les boutons radio (.woof_checkbox_count, .woof_radio_count), mais pas pour les listes déroulantes : le nombre y fait partie du texte de l’option et n’a pas d’élément propre. Le réglage, lui, couvre tous les types de filtres.

Pour modifier le compteur seulement dans certaines sections, utilisez le hook woof_term_count_format. Il reçoit le format, (%d) par défaut, et le slug de la taxonomie :

/*
 * HUSKY: counter format per filter section.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woof_term_count_format', function ($format, $tax_slug) {
    // no numbers at all in the Tags and Brand sections
    if (in_array($tax_slug, array('product_tag', 'pa_brand'), true)) {
        return '';
    }
    // "12" instead of "(12)" everywhere else
    return '%d';
}, 10, 2);

Les termes vides restent masqués dans ces sections, car le masquage dépend du compteur calculé, et non du texte imprimé. Pour n’afficher les nombres qu’au niveau le plus bas d’une arborescence de catégories, masquez avec du CSS les compteurs des termes qui ont des enfants (champ de CSS personnalisé de votre thème) :

.woof_childs_list_li > .woof_checkbox_label > .woof_checkbox_count {
    display: none;
}

Un terme sélectionné n’affiche jamais de nombre. C’est voulu : le recomptage ignore les termes qui font déjà partie de la recherche.

Pourquoi d’autres valeurs disparaissent après la première sélection

Le recomptage dynamique resserre le formulaire à chaque choix : après la sélection de Marque : Bosch, seules restent les couleurs que possèdent les produits Bosch de cette catégorie. C’est tout l’intérêt de la fonction. Il n’est pas possible de la désactiver pour une seule section.

Un autre cas est celui où le choix d’une couleur masque toutes les autres couleurs. Cela vient de la logique de la section. Ouvrez les options supplémentaires de la taxonomie (l’icône d’engrenage dans l’onglet Structure) et regardez Logique de filtrage (Logic of filtering) :

  • OR (par défaut) : les produits qui possèdent au moins l’une des valeurs sélectionnées. Chaque autre couleur est comptée séparément (dans le cadre des sélections des autres sections), de sorte que les couleurs existant dans la catégorie restent affichées.
  • AND : les produits qui possèdent toutes les valeurs sélectionnées en même temps. Le compteur de chaque autre couleur devient « produits à la fois rouges et bleus », généralement 0 ; avec Masquer les termes vides (Hide empty terms), elles disparaissent donc.
  • NOT IN : exclut les produits possédant les valeurs sélectionnées.

Pour les couleurs, les tailles et la plupart des attributs pour lesquels le visiteur veut « ceci ou cela », OR est la bonne logique. Gardez AND pour les caractéristiques qui doivent toutes être présentes, comme « Wi‑Fi et Bluetooth ».

Pour des options qui se resserrent avant même le chargement des produits (un outil de recherche composé de listes déroulantes dépendantes), utilisez [woof ajax_redraw=1 autosubmit=1] : chaque changement redessine uniquement le formulaire avec des options recomptées, et le bouton de filtrage charge les produits. ajax_redraw n’est pas prévu pour le mode AJAX ; gardez donc Essayer d’ajaxifier la boutique (Try to ajaxify the shop) désactivé pour ce formulaire.

Page boutique, pages personnalisées et constructeurs de pages

Le resserrement automatique nécessite une archive de taxonomie. Ailleurs, il n’y a pas de catégorie courante :

  • La page boutique principale affiche tout le catalogue ; tant que le visiteur ne sélectionne rien, seules les valeurs sans aucun produit dans la boutique sont donc masquées. C’est le comportement correct.
  • Une page WordPress (une page d’accueil, une page d’atterrissage, une page construite avec Elementor ou Divi qui liste une catégorie) n’est pas une archive de catégorie, même si elle n’affiche que les produits de cette catégorie. Le filtre ne peut pas le savoir et liste tout.

Sur une telle page, indiquez aux deux shortcodes de quelle catégorie parle la page. Utilisez l’ID du terme depuis Produits → Catégories (Products → Categories) :

[woof taxonomies=product_cat:15]
[woof_products taxonomies=product_cat:15 per_page=12]

L’attribut taxonomies de [woof] fait suivre cette catégorie aux compteurs et au masquage, et le même attribut dans [woof_products] limite les produits affichés. Plusieurs ID d’une même taxonomie sont séparés par des virgules (product_cat:15,16, produits de l’une ou l’autre), plusieurs taxonomies par un signe plus (product_cat:15+pa_color:22). Cela ne fonctionne que si les trois options ci‑dessus sont activées. La configuration complète de ces pages se trouve dans le filtre de produits sur une page personnalisée ou la page d’accueil.

Si ce qu’il vous faut, c’est un ensemble de sections différent par catégorie plutôt que des valeurs différentes, consultez comment afficher des filtres différents par catégorie.

Si le filtre sur une véritable archive de catégorie se comporte encore comme sur la page boutique, le modèle d’archive du thème masque peut‑être la catégorie courante au plugin ; cela arrive surtout avec les modèles basés sur des blocs. Dans Avancé → Options (Advanced → Options), réglez Vérification supplémentaire de la page de catégorie (Additional check of the category page) sur Oui.

Une option plus légère sans recomptage dynamique

Si vous voulez seulement masquer les termes qui n’ont aucun produit nulle part dans la boutique (d’anciennes tailles, une marque que vous ne vendez plus), le recomptage dynamique n’est pas nécessaire. Cet extrait demande à WordPress d’ignorer ces termes lorsque HUSKY les charge :

/*
 * HUSKY: do not list terms that have no published products at all.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woof_get_terms_args', function ($args) {
    $args['hide_empty'] = true;
    return $args;
});

Il ne coûte rien au chargement de la page, mais il ne connaît ni la catégorie courante ni la sélection du visiteur : une taille qui n’existe que pour les chaussures s’affiche encore dans la catégorie des chemises. Si Cache des termes (Cache terms) est activé, videz le cache des termes après avoir ajouté le code. La FAQ comment masquer les termes vides présente le même extrait.

Ce que coûte le recomptage dynamique sur les grands catalogues

Chaque terme du formulaire nécessite sa propre requête de comptage à chaque affichage de page, termes masqués compris : un formulaire de 300 termes exécute donc environ 300 requêtes de comptage. Sur quelques milliers de produits, cela passe inaperçu ; sur des dizaines de milliers, cela peut ralentir chaque page de catégorie. Avant de désactiver la fonction :

  • activez Mettre en cache le nombre du recomptage dynamique pour chaque élément du filtre (Cache dynamic recount number for each item in filter) dans Avancé → Options (Advanced → Options) ;
  • utilisez dynamic_recount=0 sur les formulaires où le resserrement n’est pas nécessaire, par exemple un formulaire de recherche dans l’en‑tête ;
  • envisagez le mode Turbo, qui filtre et compte à partir d’un fichier de données préparé au lieu de requêtes en base de données.

Les détails se trouvent dans comment accélérer le filtrage des produits dans les grands catalogues.

Liste de contrôle lorsque des options non pertinentes s’affichent encore

  • Afficher le compteur (Show count), Recomptage dynamique (Dynamic recount) et Masquer les termes vides (Hide empty terms) sont tous sur Oui (ou leurs copies du mode Turbo, si le mode Turbo est activé).
  • Les nombres sont masqués avec Masquer le texte du compteur des termes (Hide terms count text), et non en réglant Afficher le compteur (Show count) sur Non.
  • Le champ Recomptage dynamique (Dynamic recount) du widget est sur Par défaut (Default) ou Oui (Yes) ; il n’y a pas de dynamic_recount=0 dans le shortcode.
  • Vous testez sur une véritable archive de catégorie, ou le shortcode contient taxonomies= sur une page personnalisée.
  • Le cache de recomptage, le cache des termes et le cache de pages ont été vidés après la modification.
  • La Logique de filtrage (Logic of filtering) de l’attribut est OR si d’autres valeurs doivent rester après une sélection.

Si tout est en place et qu’une catégorie liste encore des valeurs sans produits, ouvrez un sujet sur le forum de support HUSKY avec un lien vers la page de la catégorie et la valeur qui devrait être masquée.