La navigation à facettes génère des centaines d'URL filtrées sur votre catalogue PrestaShop. Sans stratégie claire, Google indexe du contenu dupliqué, dilue votre budget crawl et ne comprend plus quelle page positionner. Canonical, noindex ou paramètres d'URL : voici comment choisir et implémenter la bonne approche.
Le problème des URL facettes en SEO
Prenons une boutique PrestaShop avec 500 produits, 3 facettes (couleur, taille, marque) et 10 valeurs par facette. La combinatoire explose rapidement : vous pouvez générer des dizaines de milliers d'URL comme :
/chaussures/running?couleur=rouge&taille=42&marque=nike
/chaussures/running?couleur=rouge&marque=nike
/chaussures/running?taille=42&couleur=rouge
Ces URL présentent trois problèmes critiques pour le SEO :
- Contenu dupliqué : plusieurs URL pour un contenu quasi-identique (même produits, ordre différent)
- Dilution du budget crawl : Googlebot perd du temps à explorer des URL sans valeur SEO
- Cannibalisation : des signaux de ranking éparpillés sur des dizaines de variantes au lieu de se concentrer sur une seule page
Les trois stratégies disponibles
1. Balise canonical
La canonical indique à Google qu'une page est une variante d'une page de référence. Elle consolide les signaux de ranking sur l'URL canonique sans empêcher l'indexation ni le crawl.
Quand l'utiliser : lorsque les pages filtrées ont une valeur commerciale mais que vous voulez éviter la duplication. Par exemple, une page "Running Nike Taille 42" avec suffisamment de volume de recherche mérite d'exister mais doit pointer vers la page catégorie principale.
Limite : Google considère la canonical comme une suggestion, pas une directive. Si la page filtrée obtient des liens entrants, Google peut décider de l'indexer quand même.
2. Meta robots noindex
Le tag noindex empêche l'indexation mais n'empêche pas le crawl. Google visite la page, la dégrade de son index, et continue. Le budget crawl est consommé.
Quand l'utiliser : pour les combinaisons de facettes sans intérêt SEO (tri par prix, filtres multiples croisés) mais où vous avez besoin que les pages soient accessibles aux utilisateurs et potentiellement suivies via des liens internes.
<meta name="robots" content="noindex, follow">
Le follow est important : il permet à Googlebot de transmettre le PageRank via les liens présents sur la page, même si elle n'est pas indexée.
3. Paramètres d'URL déclarés dans Google Search Console
Google Search Console permet de déclarer des paramètres d'URL et d'indiquer leur comportement (tri, filtrage, pagination...). Cette approche est obsolète depuis 2022 — Google a retiré cet outil et conseille désormais d'utiliser les canonicals ou le fichier robots.txt.
4. Blocage robots.txt
Bloquer les URL facettes dans le robots.txt empêche le crawl mais ne supprime pas les pages déjà indexées. À utiliser uniquement pour protéger le budget crawl sur des URL jamais indexées et sans valeur.
User-agent: *
Disallow: /*?couleur=
Disallow: /*?taille=
Disallow: /*?marque=
Attention : si les pages filtrées ont déjà des liens entrants ou sont indexées, le robots.txt les laissera dans l'index (Google ne peut pas les recrawler pour les désindexer).
Matrice de décision : quelle stratégie choisir ?
| Type de facette | Volume de recherche | Stratégie recommandée |
|---|---|---|
| Filtre sur une valeur à fort volume (ex: "running homme") | Élevé | Laisser indexer + canonical self-referencing |
| Combinaison de 2 filtres métier (ex: "nike taille 42") | Faible à moyen | Canonical → page catégorie principale |
| Tri (par prix, popularité) | Nul | noindex + robots.txt Disallow |
| Combinaisons de 3+ filtres | Nul | noindex + robots.txt Disallow |
Implémenter les canonicals dans PrestaShop
PrestaShop gère nativement une balise canonical via le hook displayHeader. Pour les pages de catégorie avec facettes, la canonical pointe généralement vers la page sans paramètres.
Voici comment implémenter une canonical dynamique dans un module selon la logique métier :
// Dans votre module
public function hookActionFrontControllerSetMedia(array $params): void
{
$controller = $this->context->controller;
if (!($controller instanceof CategoryController)) {
return;
}
$canonicalUrl = $this->buildCanonicalUrl($controller);
$this->setCanonical($canonicalUrl);
}
private function buildCanonicalUrl(CategoryController $controller): string
{
$category = $controller->getCategory();
$filters = Tools::getValue('layered_filter_token');
// Pas de filtres actifs : canonical self-referencing
if (!$filters && !Tools::getValue('n') && !Tools::getValue('orderby')) {
return $this->context->link->getCategoryLink($category);
}
// Facette avec valeur unique à fort potentiel SEO : canonical spécifique
$activeFacets = $this->getActiveFacets();
if (count($activeFacets) === 1 && $this->facetHasSeoValue($activeFacets[0])) {
return $this->getFacetCanonicalUrl($category, $activeFacets[0]);
}
// Tout le reste : canonical vers la catégorie principale
return $this->context->link->getCategoryLink($category);
}
private function setCanonical(string $url): void
{
$this->context->controller->addLinkTag([
'rel' => 'canonical',
'href' => $url,
]);
}
Implémenter le noindex sur les combinaisons sans valeur
Pour les pages de filtres multiples ou de tri, injectez le meta robots depuis un hook :
public function hookDisplayHeader(array $params): string
{
$controller = $this->context->controller;
if (!($controller instanceof CategoryController)) {
return '';
}
if (!$this->shouldNoindex()) {
return '';
}
return '<meta name="robots" content="noindex, follow">';
}
private function shouldNoindex(): bool
{
// Tri actif
if (Tools::getValue('orderby') || Tools::getValue('order')) {
return true;
}
// Pagination au-delà de la page 2
$page = (int) Tools::getValue('p', 1);
if ($page > 2) {
return true;
}
// Combinaison de 3 filtres ou plus
$activeFacets = $this->getActiveFacets();
return count($activeFacets) >= 3;
}
Configurer le robots.txt pour protéger le budget crawl
PrestaShop génère son robots.txt dynamiquement depuis Paramètres avancés → Robots. Pour bloquer les URL facettes sans valeur, ajoutez des règles spécifiques.
Attention à la syntaxe : PrestaShop utilise l'encodage URL dans ses paramètres de filtres (layered_filter). Vérifiez les URL réelles générées par votre module de facettes (ps_facetedsearch par défaut) avant d'écrire les règles.
User-agent: *
# Tris sans valeur SEO
Disallow: /*?order=
Disallow: /*?orderby=
# Pagination profonde
Disallow: /*?p=
# Paramètres de session ou AJAX
Disallow: /*?ajax=
Disallow: /*?token=
Ne bloquez pas le paramètre layered_filter en bloc : certaines combinaisons de facettes méritent d'être crawlées et indexées.
Auditer l'état de l'indexation
Avant de déployer une stratégie, auditez l'existant avec la commande Google Search :
site:votre-boutique.com inurl:layered_filter
site:votre-boutique.com inurl:orderby
site:votre-boutique.com inurl:p=
Complétez avec Google Search Console → Couverture → filtre "Indexées" pour voir le volume réel de pages facettes dans l'index.
Si des milliers de pages facettes sans valeur sont déjà indexées, une stratégie progressive s'impose :
- Ajout du noindex sur les nouvelles pages inutiles
- Canonical vers la catégorie principale pour les pages existantes
- Surveillance de la dépréciation dans Search Console sur 4-6 semaines
- Blocage robots.txt uniquement une fois les pages sorties de l'index
Conclusion
Il n'existe pas de solution universelle pour les URL facettes PrestaShop : la bonne stratégie dépend du volume de recherche associé à chaque combinaison de filtres. La règle générale reste cependant simple — si une facette correspond à une intention de recherche réelle, laissez-la indexer avec une canonical self-referencing ; pour tout le reste, combinez noindex et robots.txt pour protéger votre budget crawl et concentrer vos signaux SEO sur les pages qui comptent.
Vous gérez un catalogue volumé avec des problèmes d'indexation ? Contactez-moi pour un audit de votre stratégie facettes.