Canonicals et doublons dans PrestaShop : guide développeur

Canonicals et doublons dans PrestaShop : guide développeur
Produit multi-catégories, déclinaisons, pagination, variantes HTTPS/www : PrestaShop génère du contenu dupliqué nativement. Sources de duplication, canonicals fiables via hook, gestion des déclinaisons et checklist de cohérence des signaux : le guide développeur pour reprendre la main sur l'indexation.

Un même produit accessible via trois catégories, des déclinaisons qui génèrent autant d'URL, une pagination qui se duplique : PrestaShop produit du contenu dupliqué nativement. Sans stratégie de canonicals maîtrisée, Google éparpille vos signaux de ranking et indexe des variantes sans valeur. Voici comment diagnostiquer et corriger, côté développeur.

Pourquoi PrestaShop génère du contenu dupliqué

Le contenu dupliqué n'est pas un bug de PrestaShop, c'est une conséquence structurelle de son fonctionnement. Une même fiche produit ou page catégorie devient accessible via plusieurs URL différentes, chacune servant un contenu identique ou quasi-identique. Google doit alors deviner laquelle indexer et positionner — un travail qu'il fait mal quand on ne le guide pas.

Les principales sources de duplication dans une boutique PrestaShop :

  • Produit multi-catégories : un produit rattaché à 3 catégories peut être atteint via 3 chemins d'URL différents selon le contexte de navigation
  • Déclinaisons : le paramètre ?id_product_attribute= crée une URL par combinaison (couleur, taille…) pour un contenu très proche
  • Pagination : ?p=2, ?p=3 sur les listes de catégories
  • Tri et facettes : ?orderby=, ?order= et les filtres à facettes (traités en détail dans un article dédié)
  • Variantes techniques d'URL : HTTP vs HTTPS, avec ou sans www, slash final, majuscules/minuscules
  • Paramètres parasites : ?search_query=, campagnes UTM, tokens de session

La canonical : rappel du principe

La balise <link rel="canonical"> désigne l'URL de référence pour un contenu. Elle consolide les signaux de ranking (PageRank, ancres, historique) sur une seule URL sans bloquer le crawl ni empêcher techniquement l'indexation des variantes.

Point crucial : Google traite la canonical comme un signal fort, pas comme une directive absolue. Si une variante reçoit beaucoup de liens ou envoie des signaux contradictoires (sitemap, liens internes, hreflang), Google peut choisir de l'indexer malgré votre canonical. La cohérence de tous les signaux est donc essentielle.

Ce que PrestaShop gère nativement

Redirection canonique des URL

Dans Paramètres de la boutique → Trafic & SEO → Configuration des URL, l'option « Rediriger vers l'URL canonique » propose trois modes :

  • Aucune redirection : à proscrire, laisse vivre toutes les variantes
  • Redirection 302 (temporaire) : ne transmet pas les signaux SEO, à éviter en production
  • Redirection 301 (permanente) : le bon choix — les URL non canoniques redirigent vers l'URL propre

Ce réglage gère la réécriture des URL produit basées sur l'ID vers l'URL friendly canonique, ainsi que la suppression de paramètres superflus. Il ne couvre pas tous les cas (déclinaisons, pagination), d'où le besoin d'une logique complémentaire.

Balise canonical native

PrestaShop injecte déjà une balise canonical sur les fiches produit et pages catégorie via le cœur. Le problème : pour un produit multi-catégories, la canonical pointe vers la catégorie par défaut du produit (id_category_default). Si ce champ est mal configuré en base, la canonical part vers une catégorie non pertinente. C'est le premier point à auditer.

Auditer les doublons existants

Avant de coder, mesurez l'ampleur du problème. Trois angles complémentaires :

# 1. Volume de variantes indexées via la recherche Google
site:votre-boutique.com inurl:id_product_attribute
site:votre-boutique.com inurl:orderby
site:votre-boutique.com inurl:search_query

# 2. Google Search Console → Pages → "Page en double sans URL
#    canonique sélectionnée par l'utilisateur" et "Autre page avec
#    balise canonique correcte"

# 3. Crawl technique avec Screaming Frog : filtre Canonicals →
#    "Canonicalised" pour voir combien d'URL pointent ailleurs

Côté base de données, repérez les produits sans catégorie par défaut cohérente. Conformément aux conventions PrestaShop, on utilise DBQuery :

public function findProductsWithoutDefaultCategory(): array
{
    $query = new DbQuery();
    $query->select('p.id_product, p.id_category_default');
    $query->from('product', 'p');
    $query->leftJoin(
        'category_product',
        'cp',
        'cp.id_product = p.id_product AND cp.id_category = p.id_category_default'
    );
    $query->where('cp.id_category IS NULL');

    return Db::getInstance()->executeS($query) ?: [];
}

Un résultat non vide signale des produits dont la catégorie par défaut n'est pas dans leurs catégories associées : canonical potentiellement cassée.

Implémenter une canonical fiable dans un module

Pour reprendre la main sur la balise canonical, surchargez-la via un hook plutôt que par un override du cœur. On travaille en typage strict avec des early returns pour garder une complexité faible :

<?php

declare(strict_types=1);

public function hookActionFrontControllerSetMedia(array $params): void
{
    $controller = $this->context->controller;

    if (!($controller instanceof ProductControllerCore)) {
        return;
    }

    $product = $controller->getProduct();

    if (!Validate::isLoadedObject($product)) {
        return;
    }

    $this->setProductCanonical($product);
}

/**
 * Force la canonical produit vers l'URL de la catégorie par défaut,
 * sans déclinaison ni paramètre parasite.
 */
private function setProductCanonical(Product $product): void
{
    $canonicalUrl = $this->context->link->getProductLink(
        $product,
        null,
        null,
        null,
        (int) $this->context->language->id,
        null,
        0,          // pas d'id_product_attribute
        false,
        false,
        true        // force la catégorie par défaut
    );

    $this->context->controller->addLinkTag([
        'rel' => 'canonical',
        'href' => $canonicalUrl,
    ]);
}

L'argument 0 pour id_product_attribute garantit que toutes les déclinaisons pointent vers la fiche produit de base — la bonne pratique quand les combinaisons partagent le même contenu descriptif.

Gérer la duplication des déclinaisons

Deux cas de figure, deux stratégies :

  • Déclinaisons à contenu identique (taille, quantité) : canonical de toutes les combinaisons vers la fiche de base. C'est le comportement forcé ci-dessus.
  • Déclinaisons à intention de recherche propre (une couleur recherchée comme un produit distinct, ex. « iPhone rouge ») : là, une canonical self-referencing sur la combinaison peut se justifier, à condition d'un contenu réellement différencié (visuels, description).

Dans 90 % des cas e-commerce, la première stratégie est la bonne : évitez de multiplier les URL indexables pour des variantes qui n'ont pas de volume de recherche autonome.

Pagination : ne pas dupliquer les listes

Google a abandonné le support de rel="next"/"prev" pour l'indexation. La règle actuelle : chaque page paginée doit avoir une canonical self-referencing (la page 2 pointe vers la page 2, pas vers la page 1). Faire pointer toutes les pages vers la page 1 masquerait les produits des pages profondes.

En complément, pour économiser du budget crawl sur les pages profondes sans valeur, un noindex, follow au-delà d'un certain seuil reste pertinent — mais jamais combiné à une canonical vers la page 1, qui enverrait des signaux contradictoires.

Verrouiller les variantes techniques d'URL

Le contenu dupliqué le plus insidieux vient des variantes de domaine et de protocole. Neutralisez-les au niveau serveur, en amont de PrestaShop :

# .htaccess — forcer HTTPS + www unique + suppression du slash
# incohérent (à adapter à votre configuration serveur)

RewriteEngine On

# Forcer HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# Forcer la version avec www (ou l'inverse selon votre choix)
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Assurez-vous ensuite que le domaine déclaré dans Paramètres de la boutique → Trafic & SEO → Configuration du nom de domaine correspond exactement à la version canonique retenue, sinon PrestaShop générera des liens internes vers la mauvaise variante.

Checklist de cohérence des signaux

Une canonical n'est respectée que si tous les autres signaux vont dans le même sens. Avant de considérer le sujet clos, vérifiez que :

  1. Le sitemap XML ne contient que des URL canoniques (pas de déclinaisons ni de pages triées)
  2. Les liens internes (menu, fil d'ariane, blocs produits) pointent vers les URL canoniques
  3. Les balises hreflang, si multilingue, référencent les URL canoniques de chaque langue
  4. Le robots.txt ne bloque pas des pages que vous voulez voir désindexer via canonical (Google doit pouvoir les crawler pour lire le signal)
  5. La redirection canonique est bien en 301, pas en 302

Conclusion

Maîtriser le contenu dupliqué dans PrestaShop, c'est traiter deux niveaux : les variantes techniques d'URL (HTTPS, www, slash) qu'on neutralise au niveau serveur et dans la configuration, et les variantes fonctionnelles (multi-catégories, déclinaisons, pagination) qu'on pilote via des canonicals cohérentes. La règle d'or : une canonical n'a de valeur que si le sitemap, les liens internes et le robots.txt racontent tous la même histoire à Google. Un audit régulier via Search Console reste le meilleur garde-fou.

Votre catalogue PrestaShop souffre de doublons ou de pages fantômes dans l'index ? Contactez-moi pour un audit de votre stratégie de canonicals.

Jonathan Le-Peru

Écrit par Jonathan Le-Peru

Développeur backend avec plus de 7 ans d'expérience, spécialisé dans la création de solutions e-commerce robustes avec Prestashop. Passionné par l'optimisation des performances et les bonnes pratiques de développement.