🔍 SEOIntermédiaire PS 1.7 PS 8.x

Rich Snippets PrestaShop : corriger les données structurées produit

Corrigez les erreurs de Rich Snippets sur vos fiches produits PrestaShop : balisage Schema.org Product, conflits Smarty et validation Google.

En bref : Les Rich Snippets produit PrestaShop échouent souvent à cause d'un type Schema.org incorrect (Offers au lieu de Product), de conflits entre les accolades JSON-LD et le moteur Smarty, ou de propriétés obligatoires manquantes. La solution : utiliser le bon type Product, encadrer le JSON-LD avec {literal} dans les templates .tpl, et valider systématiquement avec l'outil de test Google.

Publié le 21 mars 2026 5 min de lecture Alexandre Carette

Pourquoi vos Rich Snippets produit ne s'affichent pas dans Google

Les Rich Snippets (extraits enrichis) permettent d'afficher directement dans les résultats Google le prix, la disponibilité et les avis de vos produits PrestaShop. Quand ils fonctionnent, le taux de clic peut augmenter de 20 à 30 %. Quand ils dysfonctionnent, c'est une opportunité SEO perdue — et parfois un signal négatif envoyé à Google.

Les erreurs de données structurées sur PrestaShop proviennent généralement de trois causes :

  1. **Un type Schema.org incorrect** (par exemple `Offers` utilisé à la place de `Product`)
  2. **Un conflit entre la syntaxe Smarty et le JSON-LD** (les accolades `{}` sont interprétées par Smarty)
  3. **Des propriétés manquantes ou mal nommées** selon la spécification Schema.org
  4. Diagnostiquer les erreurs avec les bons outils

    Avant toute correction, il est indispensable de tester vos pages avec l'outil officiel de Google :

    • **Test des résultats enrichis** : [https://search.google.com/test/rich-results](https://search.google.com/test/rich-results)
    • **Google Search Console** → Rapport "Améliorations" → "Extraits de produit"

    Ces outils vous indiquent précisément quelles propriétés sont manquantes, quels types sont invalides, et si votre balisage est bien interprété.

    Ce que Google attend pour un produit

    Pour qu'un Rich Snippet produit s'affiche, Google exige au minimum :

    PropriétéObligatoireDescription `@type`✅Doit être `Product` (pas `Offers`) `name`✅Nom du produit `image`✅URL de l'image principale `offers`✅Objet `Offer` imbriqué avec `price` et `priceCurrency` `offers.availability`✅`InStock`, `OutOfStock`, etc. `aggregateRating`RecommandéNote moyenne et nombre d'avis `brand`RecommandéMarque du produit `description`RecommandéDescription courte `sku` / `gtin`RecommandéIdentifiant produit

    Erreur classique : confusion entre Product et Offers

    Une erreur fréquente consiste à utiliser @type: "Offers" comme type principal du balisage. Or, Offers n'est pas un type racine valide pour les Rich Snippets produit — c'est un type imbriqué dans Product.

    Structure incorrecte

    
    {
      "@context": "https://schema.org",
      "@type": "Offers",
      "name": "Mon produit",
      "price": "29.90"
    }
    

    Structure correcte

    
    {
      "@context": "https://schema.org",
      "@type": "Product",
      "name": "Mon produit",
      "image": "https://monsite.com/img/produit.jpg",
      "description": "Description du produit",
      "brand": {
        "@type": "Brand",
        "name": "Ma Marque"
      },
      "offers": {
        "@type": "Offer",
        "url": "https://monsite.com/produit.html",
        "priceCurrency": "EUR",
        "price": "29.90",
        "availability": "https://schema.org/InStock"
      }
    }
    

    Notez que Offers (pluriel) dans le type racine doit être remplacé par Product, et les informations de prix sont déplacées dans un objet offers (avec un @type: "Offer" au singulier).

    Le piège Smarty : les accolades qui cassent votre JSON-LD

    Si vous injectez du JSON-LD directement dans un template .tpl de PrestaShop, vous allez rencontrer un problème majeur : Smarty interprète les accolades {} comme des balises Smarty, pas comme du JSON.

    Résultat : votre balisage structuré est soit tronqué, soit remplacé par des erreurs Smarty.

    La solution : les balises `{literal}`

    Entourez systématiquement vos blocs de script JSON-LD avec {literal} pour que Smarty ignore les accolades :

    
    {literal}
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "Product",
      "name": "Mon produit",
      "offers": {
        "@type": "Offer",
        "price": "29.90",
        "priceCurrency": "EUR",
        "availability": "https://schema.org/InStock"
      }
    }
    </script>
    {/literal}
    

    Points de vigilance :

    • La balise `{literal}` doit être **ouverte ET fermée** (`{/literal}`). Un oubli de la balise fermante cassera tout le template.
    • À l'intérieur d'un bloc `{literal}`, aucune variable Smarty ne sera interprétée. Pour injecter des valeurs dynamiques, il faut utiliser une approche hybride.

    Approche hybride : valeurs dynamiques dans un bloc literal

    Si vous devez injecter le prix ou le nom du produit dynamiquement, assignez d'abord les valeurs Smarty à des variables JavaScript :

    
    <script type="text/javascript">
      var productName = '{$product.name|escape:"javascript"}';
      var productPrice = '{$product.price|escape:"javascript"}';
    </script>
    {literal}
    <script type="application/ld+json">
    // Problème : on ne peut pas utiliser de variables ici
    </script>
    {/literal}
    

    Une meilleure approche est de construire le JSON-LD entièrement via Smarty sans {literal}, en ajoutant des espaces autour des accolades pour éviter la confusion :

    
    <script type="application/ld+json">
    { "@context": "https://schema.org",
      "@type": "Product",
      "name": "{$product.name|escape:'htmlall':'UTF-8'}",
      "image": "{$product.cover.large.url}",
      "offers": { "@type": "Offer",
        "price": "{$product.price_amount}",
        "priceCurrency": "EUR",
        "availability": "https://schema.org/{if $product.quantity > 0}InStock{else}OutOfStock{/if}"
      }
    }
    </script>
    

    Astuce Smarty : les accolades suivies d'un espace ({ "@context") ne sont pas interprétées comme du Smarty dans les versions récentes (Smarty 3+). C'est la technique la plus propre pour PrestaShop 1.7 et 8.x.

    PrestaShop 8.x : ce qui a changé

    Sur PrestaShop 8.x, le balisage structuré natif a été amélioré. Le thème classic intègre déjà un JSON-LD Product dans le template product.tpl. Avant de modifier quoi que ce soit :

    1. **Vérifiez le balisage existant** avec l'outil de test Google
    2. **Évitez les doublons** : deux blocs JSON-LD `Product` sur la même page créent de la confusion pour Google
    3. **Privilégiez un module dédié** comme `ps_legalcompliance` ou un module SEO qui centralise la gestion des données structurées
    4. Bonne pratique : sauvegardez avant de modifier

      Avant toute modification d'un fichier .tpl :

      
      cp themes/votre-theme/templates/catalog/product.tpl \
         themes/votre-theme/templates/catalog/product.tpl.bak
      

      En cas de problème, vous pourrez restaurer le fichier d'origine instantanément.

      Vérification et validation finale

      Après avoir corrigé votre balisage :

      1. **Videz le cache PrestaShop** (Paramètres avancés → Performances)
      2. **Testez avec l'outil de résultats enrichis Google** sur plusieurs fiches produits
      3. **Vérifiez dans la Search Console** après quelques jours que les erreurs disparaissent
      4. **Surveillez l'indexation** : Google peut mettre 2 à 4 semaines pour prendre en compte les modifications
      5. Un balisage structuré propre est un investissement SEO durable. Chaque fiche produit correctement balisée renforce la visibilité de votre catalogue dans les résultats de recherche.

#rich-snippets #schema-org #données-structurées #smarty #seo-technique #json-ld #google-search-console

Questions fréquentes

Tout ce que vous devez savoir sur ce sujet.

Un projet PrestaShop ?

Discutons-en directement.

★★★★★

193 projets livrés

Gratuit & sans engagement — réponse sous 24h

Alexandre Carette

Alexandre Carette

Expert PrestaShop & Architecture E-commerce

Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.