Pourquoi JSON-LD plutôt que Microdata ?
PrestaShop 1.6 et les vieux thèmes 1.7 utilisaient du Microdata intégré directement dans le HTML. C'est une approche obsolète que Google a progressivement dépréciée. JSON-LD est aujourd'hui le format recommandé par Google pour plusieurs raisons :
- Séparation du contenu et des données — le JSON-LD vit dans un bloc
<script>indépendant, plus facile à maintenir et à déboguer. - Pas de couplage au HTML — vous pouvez modifier le template Smarty sans risquer de casser le balisage structuré.
- Pas de duplicate content structuré — le problème classique avec Microdata sur PS 1.6 : le même produit était balisé en microdata dans le HTML ET en JSON-LD par un module tiers, créant des conflits que Google signalait dans la GSC.
Si vous avez migré de PS 1.6 vers 1.7 sans nettoyer le thème, vous avez probablement encore du Microdata dans vos templates Smarty ET un module JSON-LD actif. Google détecte ce conflit et signale des erreurs dans la Search Console. Auditez avant d'ajouter du JSON-LD.
Les types Schema.org essentiels pour PrestaShop
Product — fiche produit
C'est le plus important. Un bon balisage Product peut générer des rich snippets avec prix, disponibilité et notes dans les SERP — ce qui améliore le CTR de 20 à 35% selon les études.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "{$product.name}",
"description": "{$product.description_short|strip_tags}",
"sku": "{$product.reference}",
"image": "{$product.cover.large.url}",
"brand": {
"@type": "Brand",
"name": "{$product.manufacturer_name}"
},
"offers": {
"@type": "Offer",
"url": "{$product.url}",
"priceCurrency": "EUR",
"price": "{$product.price_amount}",
"availability": "{if $product.availability == 'available'}
https://schema.org/InStock
{else}
https://schema.org/OutOfStock
{/if}",
"seller": {
"@type": "Organization",
"name": "{$shop.name}"
}
}
}Ce template Smarty est à intégrer dans un <script type="application/ld+json"> dans le fichier product.tpl de votre thème, ou via un hook PrestaShop dédié.
AggregateRating — avis clients
Si votre boutique a des avis clients, ajoutez le bloc AggregateRating à votre Product. C'est ce qui génère les étoiles dans les résultats Google :
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "{$product.average_grade}",
"reviewCount": "{$product.nb_reviews}",
"bestRating": "5",
"worstRating": "1"
}BreadcrumbList — fil d'Ariane
Chaque page produit et catégorie doit avoir son BreadcrumbList. C'est un signal fort pour la compréhension de la structure du site par Google, et ça génère les breadcrumbs dans les SERP :
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Accueil",
"item": "{$urls.base_url}"
},
{
"@type": "ListItem",
"position": 2,
"name": "{$category.name}",
"item": "{$category.url}"
},
{
"@type": "ListItem",
"position": 3,
"name": "{$product.name}",
"item": "{$product.url}"
}
]
}Organization — page d'accueil
Sur la homepage, un bloc Organization ou LocalBusiness avec les informations de contact renforce votre présence dans le Knowledge Graph Google :
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "{$shop.name}",
"url": "{$urls.base_url}",
"logo": "{$shop.logo}",
"contactPoint": {
"@type": "ContactPoint",
"telephone": "{$shop.phone}",
"contactType": "customer service",
"areaServed": "FR",
"availableLanguage": "French"
},
"address": {
"@type": "PostalAddress",
"streetAddress": "{$shop.address.address1}",
"addressLocality": "{$shop.address.city}",
"postalCode": "{$shop.address.postcode}",
"addressCountry": "FR"
}
}Intégration dans PrestaShop : les 3 méthodes
Méthode 1 : Directement dans les templates Smarty
La plus propre et la plus maintenable. Vous créez un fichier product-jsonld.tpl et l'incluez via {include file='product-jsonld.tpl'} dans product.tpl. Avantage : le balisage survit aux mises à jour du thème si vous utilisez un thème child.
Méthode 2 : Via un module PrestaShop dédié
Des modules comme SEO Expert ou Pretty URLs proposent la génération JSON-LD. Avantage : plus facile à configurer sans coder. Inconvénient : les modules tiers ont tendance à générer du JSON-LD générique qui ne profite pas de toutes les données disponibles dans PrestaShop.
Méthode 3 : Module custom
La solution que je recommande pour les boutiques sérieuses. Un module PS custom qui hook sur displayHeader et génère le JSON-LD approprié selon le type de page courante. Cela donne un contrôle total sur le balisage, sans modifier les templates du thème.
// Dans votre module custom, méthode hookDisplayHeader()
public function hookDisplayHeader($params)
{
$controller = $this->context->controller;
if ($controller instanceof ProductController) {
$product = $controller->getTemplateVarProduct();
$jsonld = $this->generateProductSchema($product);
return '<script type="application/ld+json">'
. json_encode($jsonld, JSON_UNESCAPED_UNICODE)
. '</script>';
}
}Valider et monitorer votre JSON-LD
Une fois implémenté, validez systématiquement avec ces outils :
- Google Rich Results Test (search.google.com/test/rich-results) — valide que Google peut lire et interpréter votre JSON-LD, et prévisualise les rich snippets potentiels.
- Schema.org Validator (validator.schema.org) — validation syntaxique complète, plus exhaustive que le Rich Results Test.
- Google Search Console → Améliorations — vous montre toutes les erreurs et avertissements détectés sur l'ensemble du site, avec les URLs affectées.
Après une implémentation correcte du JSON-LD Product sur une boutique de 800 références, on observe généralement l'apparition des rich snippets dans les SERP en 4 à 8 semaines, avec une augmentation du CTR organique de 15 à 30% sur les pages produits concernées.
Erreurs JSON-LD les plus fréquentes sur PrestaShop
- Prix sans devise — le champ
priceCurrencyest obligatoire. Beaucoup d'implémentations l'omettent. - URL de l'image relative —
imagedoit être une URL absolue. Les paths relatifs comme/img/p/123.jpgsont invalides. - AggregateRating avec 0 avis — ne jamais afficher un bloc
aggregateRatingsi le produit n'a pas encore d'avis. Google pénalise les ratings fabricés. - Availability statique — mettre
InStocken dur alors que le produit peut être en rupture. L'availability doit être dynamique. - Microdata résiduel + JSON-LD — le cas le plus fréquent sur les migrations. Les deux formats en même temps créent des conflits que Google signale en erreur.