# Facettes et filtres de produits : éviter l’indexation de pages dupliquées

> Chaque combinaison de filtres sur une boutique WooCommerce crée potentiellement une nouvelle URL. Sans stratégie claire, des milliers de pages quasi identiques finissent indexées.

- Auteur : Clément Hadrot
- Publié le : 2022-06-21
- Mis à jour le : 2022-06-21
- Catégorie : SEO &amp; GEO
- URL : https://wpmoderne.dev.wordpress-developpement.fr/seo/facettes-filtres-produits-pages-dupliquees/

## L’essentiel

- Une combinaison de filtres peut générer des milliers d'URL distinctes
- Toutes ne méritent pas d'être indexées
- Paramètres d'URL, noindex et blocage d'exploration se combinent selon le cas

Une boutique de matériel de bricolage que j'ai auditée proposait des filtres croisés sur la marque, la couleur, le prix et la disponibilité en stock. Sur le papier, une fonctionnalité de confort pour l'utilisateur. En pratique, la combinatoire de ces quatre filtres, chacun pouvant être activé ou non, générait plus d'un millier d'URL distinctes, chacune accessible directement, et une bonne partie d'entre elles indexées sans qu'aucune décision explicite n'ait jamais été prise en ce sens.

Ce phénomène, connu sous le nom de navigation à facettes, est l'une des causes les plus sournoises de contenu dupliqué à grande échelle sur les sites e-commerce. Il ne s'agit pas d'un bug, mais d'une fonctionnalité utile mal maîtrisée du point de vue du référencement technique.

## Pourquoi les facettes posent un problème spécifique

Une page de catégorie classique (`/outillage/`) mérite naturellement d'être indexée : elle correspond à une intention de recherche identifiable. Une combinaison de filtres très spécifique (`/outillage/?marque=bosch&couleur=bleu&stock=oui`) correspond rarement à une recherche que quelqu'un formulerait telle quelle, et son contenu est souvent quasi identique à d'autres combinaisons voisines : quelques produits en plus ou en moins, le même gabarit de page, le même texte d'introduction.

Ce n'est pas tant l'existence de ces URL qui pose problème (les visiteurs en ont besoin), que leur indexation massive et automatique par les moteurs de recherche, qui dilue l'autorité du site sur un grand nombre de pages à faible valeur individuelle, et gaspille le budget d'exploration que les robots consacrent au site.

## Trois leviers, pas un seul

> L'essentiel à retenir : Une combinaison de filtres peut générer des milliers d'URL distinctes ; Toutes ne méritent pas d'être indexées ; Paramètres d'URL, noindex et blocage d'exploration se combinent selon le cas

Il n'existe pas de solution unique à ce problème ; la bonne approche combine généralement plusieurs leviers selon le contexte de chaque combinaison de filtres.

| Levier | Effet | Cas d'usage typique |
| --- | --- | --- |
| Balise canonical vers la catégorie parente | Regroupe le signal SEO sur la page mère | Filtre unique peu porteur de valeur (ex. tri par prix) |
| Directive `noindex` via `wp_robots` | Retire la page des résultats sans bloquer l'exploration | Combinaisons de filtres multiples, peu recherchées |
| Blocage dans `robots.txt` | Empêche l'exploration elle-même du motif d'URL | Paramètres techniques sans aucune valeur (session, tri interne) |

La différence entre `noindex` et un blocage dans `robots.txt` est essentielle et souvent confondue : une page bloquée dans `robots.txt` n'est jamais explorée, donc son éventuelle balise `noindex` n'est jamais lue. Bloquer par `robots.txt` une URL qui porte un `noindex` revient à rendre ce `noindex` totalement inutile, un piège classique quand les deux mécanismes sont ajoutés séparément sans coordination.

## Mettre en œuvre le noindex conditionnel

Sur une boutique WooCommerce, la détection des pages de filtres actifs passe généralement par l'inspection des paramètres de requête présents dans l'URL :

```
add_filter( 'wp_robots', function( $robots ) {
    if ( is_shop() || is_product_category() ) {
        $parametres_filtres = array( 'marque', 'couleur', 'stock' );
        foreach ( $parametres_filtres as $parametre ) {
            if ( isset( $_GET[ $parametre ] ) ) {
                $robots['noindex'] = true;
                break;
            }
        }
    }
    return $robots;
} );
```

Cette approche laisse volontairement une porte de sortie : une combinaison de filtres qui génère un trafic de recherche significatif et mesuré peut être retirée de cette liste au cas par cas, pour redevenir indexable en connaissance de cause plutôt que par défaut.

## Le rôle du fichier robots.txt

Pour les paramètres purement techniques, sans aucune valeur de recherche possible (un identifiant de session, un paramètre de tri interne), un blocage direct dans le `robots.txt` reste la solution la plus économe en budget d'exploration :

```
add_filter( 'robots_txt', function( $output, $public ) {
    if ( '1' === $public ) {
        $output .= "Disallow: /*?*tri=\n";
        $output .= "Disallow: /*?*session_id=\n";
    }
    return $output;
}, 10, 2 );
```

## Prioriser selon le volume réel

Avant toute action, un export des URL explorées depuis Google Search Console (rapport de couverture, filtré par motif d'URL) donne une idée concrète de l'ampleur réelle du problème sur un site donné. Certains sites n'ont que quelques dizaines de combinaisons problématiques, d'autres plusieurs milliers : l'intervention n'a évidemment pas la même urgence.

> Sur un site avec beaucoup de filtres croisés, je commence toujours par mesurer avant d'agir. Bloquer trop large peut retirer de l'index des pages de filtre qui, elles, généraient un trafic réel et mesurable.

## En résumé

La navigation à facettes est une fonctionnalité utile aux visiteurs et risquée pour le référencement si elle n'est pas encadrée. La combinaison de canonical, de `noindex` conditionnel via `wp_robots` et de blocage ciblé dans `robots.txt` permet de garder le confort de navigation sans laisser les moteurs de recherche indexer des milliers de variantes à faible valeur. La bonne répartition entre ces trois leviers dépend toujours d'une mesure préalable du volume réel de pages concernées.
