01 · Contexte & objectif
Réaliser un site e-commerce sous WordPress. Projet individuel, trois jours, en décembre 2025. La boutique s’appelle TechShop et vend des composants informatiques.
Un sujet WordPress peut se traiter sans écrire une ligne : un thème du répertoire, WooCommerce, quelques réglages, et le site existe. J’ai pris le chemin inverse — thème écrit de zéro et extension maison — parce que l’intérêt du module n’était pas d’avoir une boutique à la fin, mais de comprendre par où WordPress se laisse étendre.
02 · Le thème
themeprojet est un thème complet, pas un thème enfant : header.php,
footer.php, front-page.php, index.php, single.php, page.php,
archive.php, plus les pages Contact, À propos et Mentions légales.
Il crée ses propres pages à l’activation. Un add_action('after_switch_theme', …) insère Contact, À propos et Mentions légales si elles n’existent pas déjà —
le thème est donc autonome : on l’active et le site est debout, sans étape
manuelle dans l’administration.
03 · L’extension : historique des prix
WooCommerce affiche le prix courant d’un produit, jamais ce qu’il valait avant. L’extension « Historique de prix » comble ça en se branchant à deux endroits :
save_post— à chaque enregistrement d’un produit, le prix courant est comparé au dernier relevé ; s’il a changé, une entrée{ prix, date }est ajoutée dans une post meta_price_history. La comparaison évite d’empiler des doublons à chaque sauvegarde sans changement de prix.woocommerce_single_product_summary— l’historique s’affiche sur la fiche produit, du plus récent au plus ancien, et seulement s’il compte au moins deux entrées : un produit dont le prix n’a jamais bougé n’a pas d’historique à montrer.
Aucun fichier du cœur ni de WooCommerce n’est modifié. L’extension ne fait que s’abonner.
04 · Le piège du template surchargé
Le thème remplace le gabarit produit de WooCommerce par le sien
(woocommerce/single-product.php), pour maîtriser la mise en page.
C’est là que le projet m’a appris quelque chose. En reprenant un gabarit, on
n’hérite pas seulement de son HTML : on hérite de ses hooks. Le gabarit
d’origine déclenche woocommerce_single_product_summary, et une bonne partie de
l’écosystème s’y accroche — les avis, les variations, les extensions tierces, et
en l’occurrence la mienne. Un gabarit personnalisé qui oublie ce
do_action(...) fait disparaître tout ce monde-là, sans aucune erreur : la
page s’affiche, elle est simplement amputée.
Mon gabarit rappelle donc explicitement
do_action('woocommerce_single_product_summary'). C’est une seule ligne, et
c’est ce qui fait que l’extension écrite juste avant continue de fonctionner.
05 · Ce que j’en retire
C’est un petit projet — trois jours, seul — et je ne vais pas prétendre le contraire. Ce que j’en garde tient en une idée, mais elle vaut au-delà de WordPress : on n’étend pas un système en le modifiant, on l’étend en s’y abonnant. Les hooks sont un contrat public ; tant qu’on passe par eux, une mise à jour du cœur ou de WooCommerce ne casse rien.
Et son corollaire, appris à mes dépens : dès qu’on reprend la main sur un gabarit, on reprend aussi la responsabilité de son contrat. Une surcharge ne coûte rien à écrire et fait taire en silence tout ce qui dépendait de ce qu’on vient de remplacer.
Avec le recul, tout est stylé en ligne dans les gabarits et le formulaire de contact n’est branché à rien — deux choses que je ne referais pas ainsi aujourd’hui.
01 · Context & goal
Build an e-commerce site on WordPress. Solo project, three days, December 2025. The shop is called TechShop and sells computer components.
A WordPress brief can be met without writing a single line: a theme from the directory, WooCommerce, a few settings, and the site exists. I went the other way — a theme written from scratch and a homemade plugin — because the point of the module was not to end up with a shop, but to understand where WordPress lets itself be extended.
02 · The theme
themeprojet is a full theme, not a child theme: header.php, footer.php,
front-page.php, index.php, single.php, page.php, archive.php, plus
Contact, About and Legal Notice pages.
It creates its own pages on activation. An add_action('after_switch_theme', …)
inserts Contact, About and Legal Notice if they do not already exist — so the
theme is self-contained: activate it and the site stands up, with no manual step
in the admin.
03 · The plugin: price history
WooCommerce shows a product’s current price, never what it used to cost. The “Price history” plugin fills that gap by hooking in at two points:
save_post— every time a product is saved, the current price is compared with the last recorded one; if it changed, a{ price, date }entry is appended to a_price_historypost meta. The comparison avoids piling up duplicates on every save with no price change.woocommerce_single_product_summary— the history renders on the product page, newest first, and only when there are at least two entries: a product whose price never moved has no history to show.
No core or WooCommerce file is modified. The plugin only subscribes.
04 · The overridden-template trap
The theme replaces WooCommerce’s product template with its own
(woocommerce/single-product.php), to control the layout.
That is where the project taught me something. Taking over a template does not
just inherit its HTML: it inherits its hooks. The original template fires
woocommerce_single_product_summary, and a good part of the ecosystem hangs off
it — reviews, variations, third-party extensions, and in this case my own. A
custom template that forgets that do_action(...) makes all of them vanish,
with no error at all: the page renders, it is simply missing pieces.
So my template explicitly calls do_action('woocommerce_single_product_summary')
again. It is a single line, and it is what keeps the plugin written just before
it working.
05 · What I take away
This is a small project — three days, alone — and I am not going to pretend otherwise. What I keep from it is one idea, but it reaches well beyond WordPress: you do not extend a system by modifying it, you extend it by subscribing to it. Hooks are a public contract; as long as you go through them, a core or WooCommerce update breaks nothing.
And its corollary, learned the hard way: the moment you take over a template, you also take over its contract. An override costs nothing to write and silently silences everything that depended on what you just replaced.
In hindsight, everything is styled inline in the templates and the contact form is wired to nothing — two things I would not do the same way today.