L'essentiel en 4 points
- Un module PrestaShop est un dossier de /modules/, avec un fichier PHP et une classe qui portent son nom et qui héritent de la classe Module.
- Un module se branche par des crochets (hooks). PrestaShop déconseille les overrides dans un module que tu diffuses.
- Pour viser la 1.7.8 et la 9.2 avec le même code, écris du PHP que la 7.4 comprend, et reste sur les outils historiques du cœur plutôt que sur Symfony (3.4 dans la 1.7.8.11, 6.4 dans la 9.2.0).
- Le module du dossier, Markdown Twin, donne à chaque page une version Markdown. Au labo, la fiche d'un mug passe de 131 523 octets en HTML à 6 012 octets en Markdown.
1.1Module, extension, plugin : de quoi on parle ?
Sous WordPress, tu installes des plugins. Sous PrestaShop, tu installes des modules.
C'est la même idée : du code écrit par d'autres qui ajoute une fonction à ta boutique. Mais je t'arrête tout de suite, ce n'est pas qu'une affaire de mot ! Si tu cherches « plugin » dans la documentation de PrestaShop ou sur sa place de marché, tu passes à côté de la moitié des réponses. Alors prends le pli dès maintenant, et dis module ;)
Et PrestaShop lui-même est fait de modules ! Le paiement à la livraison, la barre de recherche, les commentaires produits, le plan du site pour Google, tout ça vient en modules. Sur une 9.2.0 qui sort de l'installeur, on en a compté 77 actifs, je te les présente dans le dossier Installer PrestaShop.
Concrètement, je résume un module à trois choses.
- Un dossier dans
/modules/, dont le nom est le nom technique du module, en minuscules. Le nôtre s'appellemarkdowntwin. - Dans ce dossier, un fichier PHP qui porte le même nom,
markdowntwin.php. - Dans ce fichier, une classe qui hérite de la classe
Moduledu cœur.
Le reste est facultatif ! Je te monte ce squelette ligne par ligne au chapitre suivant.
Pour changer le comportement de la boutique, un module a deux portes. La bonne : les crochets, des points prévus par PrestaShop où ton code est appelé. La documentation les définit en une phrase, « Hooks are a way to associate your code to some specific PrestaShop events. » L'autre porte, ce sont les overrides, qui remplacent une classe du cœur par la tienne. La même documentation est très claire là-dessus : « It is not recommended to use an override in a module that you intend to distribute (for instance through the PrestaShop Addons marketplace), and they are forbidden in partner modules. »
Notre module n'a aucun override, et je te conseille d'en faire autant. Tout passe par quatre crochets, que je te détaille au chapitre sur les crochets.
1.2Quelles versions de PrestaShop viser en 2026 ?
La dernière version est la 9.2.0, sortie le 30 septembre 2026. Si tu écris un module pour une boutique neuve, vise-la, et arrête-toi là.
Mais si tu écris pour une boutique qui existe déjà ?
Il y a de bonnes chances qu'elle ne soit pas en 9.2, et je parle d'expérience. La boutique pour laquelle on a écrit ce module tourne en 1.7.8, et je ne crois pas qu'elle soit une exception. C'est pour ça que le labo a deux boutiques, une 9.2.0 et une 1.7.8.11, la toute dernière version de la branche 1.7. Le module devait tourner sur les deux, avec le même code.
Et là, surprise ! Les deux versions ne parlent pas le même PHP.
| PrestaShop 1.7.8.11 | PrestaShop 9.2.0 | |
|---|---|---|
| PHP accepté | 7.1.3 à 7.4 | 8.1 à 8.5 |
| PHP du labo | 7.4.33 | 8.3.32 |
| Symfony embarqué | 3.4.49 | 6.4.46 |
| Règle d'adresse d'un produit | {category:/}{id}{-:id_product_attribute}-{rewrite}{-:ean13}.html | {id}{-:id_product_attribute}-{rewrite}.html |
Pour le PHP, je m'en tiens à une règle simple. Le module doit être lu par le plus vieux PHP de la plus vieille version visée. On s'est donc interdit tout ce que PHP 8 a apporté, et le module a tourné sous PHP 7.4.33 comme sous 8.3.32. Je n'ai pas essayé PHP 7.1, le plancher théorique de la 1.7.8.11 : si ta boutique tourne encore dessus, teste avant.
Pour Symfony, je te préviens, c'est plus sournois. Les pages d'administration « modernes » de PrestaShop reposent dessus, et entre la 3.4 et la 6.4, beaucoup de choses ont bougé. Notre module s'en tient aux outils historiques du cœur, une classe Module, un contrôleur de boutique, un formulaire de réglages construit par HelperForm. Ce n'est pas le plus moderne, mais c'est ce qui voyage le mieux, et je l'assume. Le même formulaire s'affiche en 1.7.8.11 et en 9.2.0, sans une ligne de différence dans le code. Je te le montre au chapitre sur les réglages.
La dernière ligne du tableau compte aussi. Les adresses des produits ne sont pas construites pareil d'une version à l'autre, avec la catégorie devant en 1.7, sans en 9.2. Un module qui fabrique des adresses doit partir de la règle de la boutique, jamais d'une adresse écrite en dur. J'y reviens avec les routes.
1.3L'exemple du dossier : Markdown Twin
Le principe de Markdown Twin, je te le donne en une phrase : chaque page de la boutique a un jumeau en Markdown. Même contenu, sans l'interface autour (menus, filtres, boutons, fenêtres), avec en tête les faits de la page, sous une forme qu'un programme lit sans deviner.
Le module fait quatre choses.
- Le jumeau. Ajoute
.mdà l'adresse d'une page, et tu reçois sa version Markdown./19-customizable-mug.htmldevient/19-customizable-mug.html.md, et l'accueil a son/index.md. - La négociation. L'adresse normale répond en Markdown à qui le demande par l'en-tête
Accept: text/markdown. Un navigateur ne le demande jamais, tes visiteurs reçoivent toujours la page HTML. - L'annonce. Chaque page HTML signale son jumeau, par une balise
<link rel="alternate" type="text/markdown">et par un en-tête HTTPLink. - Le sommaire. Une adresse
/llms.txtliste les catégories, les produits, les pages et les marques, avec le lien de leur jumeau.
Je te montre le début du jumeau de la fiche du mug personnalisable, la fiche de démo de la 9.2.0, tel que le labo l'a servi.
---
title: Mug personnalisable
description: Mug en céramique blanche. 325ml
url: "http://127.0.0.1:8092/19-customizable-mug.html"
markdown_url: "http://127.0.0.1:8092/19-customizable-mug.html.md"
type: product
language: fr-FR
product:
id: 19
reference: demo_14
brand: Studio Design
price: 16.68
currency: EUR
prices_include_tax: true
availability: in_stock
generator: Markdown Twin 1.0.0 for PrestaShop
---
| Fact | Value |
| --- | --- |
| Price | 16,68 € (tax included) |
| Availability | In stock |
| Reference | demo_14 |
| Brand | Studio Design |
# Mug personnalisableTu as vu l'anglais dans le tableau ? Le tableau des faits est en anglais, même sur une boutique en français. C'est un défaut de cette version, et il y en a d'autres, plus sérieux, que je te raconte dans le dernier chapitre.
Ce que je trouve le plus parlant : le poids. La page HTML de ce mug pèse 131 523 octets, son jumeau 6 012 !
Plus de vingt fois moins de texte à lire pour un agent, et les faits rangés au même endroit sur chaque fiche.
Et Google, dans tout ça ?
Soyons francs, Google n'est pas la cible. Il le dit lui-même, aucun fichier spécial n'est nécessaire pour apparaître dans ses réponses d'IA, et je t'en parle dans le chapitre Google, les IA et ton WordPress. Le jumeau sort donc avec un en-tête X-Robots-Tag: noindex, follow et un lien canonical vers la page HTML. C'est elle qui reste indexée, le jumeau ne lui fait pas concurrence.
1.4Le labo : deux boutiques, un seul module
Les deux boutiques du labo sont celles du dossier Installer PrestaShop, installées par l'assistant avec leurs produits de démo. Le dossier du module est branché dans les deux à la fois, par un lien. Une modification se voit donc dans les deux boutiques, sans copie.
Il me fallait aussi un blog. La boutique pour laquelle on a écrit ce module a le sien, dans un module à part, avec ses propres adresses. On a donc écrit un petit module de blog de labo, qui reprend la forme de ces adresses, /blog/la-route-de-la-lavande-n106 pour un article. Tu vas voir au chapitre des routes qu'il a servi à quelque chose ;)
Le labo du dossier, le 19 octobre 2026
- PrestaShop 9.2.0, thème Hummingbird, PHP 8.3.32 ; PrestaShop 1.7.8.11, thème Classic, PHP 7.4.33.
- Apache 2.4.69 et MariaDB 11.4.13, sous Windows 10, une base par boutique.
- Markdown Twin 1.0.0, le même dossier branché dans les deux boutiques, plus un module de blog de labo.
- Un banc de contrôle HTTP, sans dépendance, qui interroge huit pages par boutique.
Tu as tes deux boutiques ? Alors on peut monter le squelette du module, et c'est plus court que tu ne le crois. Tout est dans le chapitre sur le squelette.
Sources
Historique de ce chapitre
- 19 octobre 2026 : première version, mesurée au labo sur PrestaShop 9.2.0 et 1.7.8.11.

Co-fondateur de Kōeki · Consultant SEO et IA
Sébastien Grillot
Consultant SEO depuis 2009 : c'est ici, sur Inside da WeB, qu'il a monté sa première agence, spécialisée dans l'e-commerce. Il construit aujourd'hui ses propres outils avec l'IA, modules PrestaShop compris.
