Aller au contenu
Rechercher
Discutons
Menu

Dossier module PrestaShop · chapitre 1 sur 6

Un module PrestaShop en 2026, et celui qu'on va construire

Un module PrestaShop est un dossier qui porte son nom, avec une classe PHP du même nom. Le plus dur n'est pas là, mais dans l'écart entre les versions, puisque la 1.7 plafonne à PHP 7.4 quand la 9.2 démarre à PHP 8.1. Voici les versions à viser, et le module qu'on va construire pour de vrai.

Par Sébastien GrillotTesté au labo : 19 octobre 2026Publié : 19 octobre 2026
Testé sur
PrestaShop 9.2.0 · PHP 8.3.32
Et sur
PrestaShop 1.7.8.11 · PHP 7.4.33
Module
Markdown Twin 1.0.0, de Kōeki

L'essentiel en 4 points

  1. 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.
  2. Un module se branche par des crochets (hooks). PrestaShop déconseille les overrides dans un module que tu diffuses.
  3. 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).
  4. 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.

  1. Un dossier dans /modules/, dont le nom est le nom technique du module, en minuscules. Le nôtre s'appelle markdowntwin.
  2. Dans ce dossier, un fichier PHP qui porte le même nom, markdowntwin.php.
  3. Dans ce fichier, une classe qui hérite de la classe Module du 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.

Les deux versions du labo, relevées dans leur code le 19 octobre 2026
PrestaShop 1.7.8.11PrestaShop 9.2.0
PHP accepté7.1.3 à 7.48.1 à 8.5
PHP du labo7.4.338.3.32
Symfony embarqué3.4.496.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.html devient /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 HTTP Link.
  • Le sommaire. Une adresse /llms.txt liste 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 personnalisable
Début du jumeau de /19-customizable-mug.html, servi par le labo 9.2.0 le 19 octobre 2026 (extrait)

Tu 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.
Sébastien Grillot

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.