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.
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 :
- **Un type Schema.org incorrect** (par exemple `Offers` utilisé à la place de `Product`)
- **Un conflit entre la syntaxe Smarty et le JSON-LD** (les accolades `{}` sont interprétées par Smarty)
- **Des propriétés manquantes ou mal nommées** selon la spécification Schema.org
- **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"
- 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.
- **Vérifiez le balisage existant** avec l'outil de test Google
- **Évitez les doublons** : deux blocs JSON-LD `Product` sur la même page créent de la confusion pour Google
- **Privilégiez un module dédié** comme `ps_legalcompliance` ou un module SEO qui centralise la gestion des données structurées
- **Videz le cache PrestaShop** (Paramètres avancés → Performances)
- **Testez avec l'outil de résultats enrichis Google** sur plusieurs fiches produits
- **Vérifiez dans la Search Console** après quelques jours que les erreurs disparaissent
- **Surveillez l'indexation** : Google peut mettre 2 à 4 semaines pour prendre en compte les modifications
Diagnostiquer les erreurs avec les bons outils
Avant toute correction, il est indispensable de tester vos pages avec l'outil officiel de Google :
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 :
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 :
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 :
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 :
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.
Questions fréquentes
Tout ce que vous devez savoir sur ce sujet.
Un projet PrestaShop ?
Discutons-en directement.
193 projets livrés
Lire sur le blog

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.