Créer un thème WordPress custom : guide complet
Quand j’ai commencé à travailler comme développeur WordPress freelance, j’utilisais des thèmes premium que je customisais à coup de child themes et de CSS surchargé. Puis un jour, un client m’a demandé quelque chose de vraiment sur mesure. C’est là que j’ai franchi le pas : créer un thème WordPress custom de A à Z. Et honnêtement, je ne suis jamais revenu en arrière 😊
Dans ce guide, je vous explique concrètement comment créer votre propre thème WordPress, des bases classiques jusqu’à l’approche moderne avec Sage et Bedrock. Que vous soyez développeur junior ou que vous cherchiez à monter en compétences, ce retour d’expérience terrain devrait vous être utile.
Pourquoi créer un thème WordPress custom plutôt qu’utiliser un thème existant ?
La question revient souvent : pourquoi se donner tout ce mal alors qu’il existe des milliers de thèmes prêts à l’emploi ? Pour ma part, la réponse tient en trois points. Premièrement, les performances. Un thème sur mesure ne charge que le strict nécessaire, là où un thème générique embarque des tonnes de fonctionnalités inutiles. D’ailleurs, si les performances web vous intéressent, j’ai écrit un article complet sur l’optimisation des performances WordPress.
Deuxièmement, la maintenabilité. Quand vous maîtrisez chaque ligne de code de votre thème, les mises à jour et les évolutions deviennent bien plus simples. Pas de surcharge de child theme bancale, pas de conflit avec un page builder capricieux. Troisièmement, la liberté créative totale. Vous n’êtes plus limité par les options d’un theme builder — vous codez exactement ce dont le projet a besoin.
Les bases d’un thème WordPress : la méthode classique
Avant de parler d’outils modernes, il est essentiel de comprendre les fondamentaux. Un thème WordPress classique repose sur quelques fichiers placés dans un dossier de votre installation :
- style.css : contient l’en-tête du thème (nom, version, auteur) — c’est ce fichier qui identifie le thème auprès de WordPress
- index.php : le template par défaut, le fallback ultime de la hiérarchie de templates WordPress
- functions.php : le fichier où l’on enregistre les scripts, styles, menus et fonctionnalités du thème
Cette approche fonctionne et reste pertinente pour comprendre le fonctionnement interne de WordPress. Cependant, sur des projets professionnels, elle montre vite ses limites : pas de templating moderne, pas de gestion propre des dépendances, et un functions.php qui devient vite un fourre-tout ingérable.
Passer à l’approche moderne : Sage + Bedrock
C’est là que les choses deviennent intéressantes. Après quelques projets en thème classique, j’ai adopté la stack Roots et je ne reviendrais en arrière pour rien au monde. Par conséquent, voici les deux piliers de ma méthode actuelle.
Bedrock : une vraie structure de projet
Bedrock repense complètement l’organisation de WordPress. Fini le wp-content/ classique. Avec Bedrock, votre thème vit dans app/themes/, les plugins dans app/plugins/, et WordPress lui-même est géré comme une dépendance Composer dans un dossier wp/ séparé. La configuration passe par des fichiers .env, ce qui permet d’avoir des environnements distincts (dev, staging, prod) sans toucher au code. En pratique, c’est un gain énorme en propreté et en sécurité.
Sage : un starter theme qui change tout
Sage est le starter theme de Roots. Sa structure n’a plus grand-chose à voir avec un thème WordPress classique :
- app/ : toute la logique PHP — Service Providers, View Composers, filtres, setup du thème. Chaque classe est autoloadée via Composer (PSR-4), fini le
require_onceen cascade dansfunctions.php - resources/views/ : les templates utilisent Laravel Blade, un moteur de templates bien plus puissant que le PHP brut. Layouts, composants, partials — tout est modulaire
- resources/css/ et resources/js/ : les assets sources, compilés automatiquement
- public/ : les assets compilés (c’est ce dossier qui est servi en production)
Le functions.php existe toujours, mais il est minimal : c’est un simple bootloader. Toute la logique métier est dans app/, organisée en Service Providers comme dans un projet Laravel.
L’approche blocs ACF modulaires : créer un thème WordPress custom vraiment performant
C’est la pièce maîtresse de ma méthode actuelle, et ce qui fait la plus grosse différence en termes de performances. L’idée est simple : chaque bloc Gutenberg est un module autonome.
Un bloc = un module isolé
Concrètement, pour chaque bloc ACF que je crée, j’ai :
- Un template Blade : la vue du bloc, dans
resources/views/blocks/ - Un fichier CSS en BEM : les styles scopés au bloc, avec une nomenclature BEM stricte pour éviter tout conflit
- Un fichier JS associé (si nécessaire) : pour les interactions spécifiques au bloc
Le point crucial : seuls les assets des blocs présents sur la page sont chargés. Si une page utilise 3 blocs sur les 20 disponibles, le navigateur ne télécharge que le CSS et le JS de ces 3 blocs. Pas de fichier CSS monolithique de 200 Ko dont 90% est inutile sur la page en cours.
Pourquoi c’est supérieur à l’approche classique
Dans un thème WordPress classique, on charge généralement un gros fichier CSS global et un fichier JS global via wp_enqueue_scripts. Résultat : chaque page embarque tout le code du site, même ce qui ne sert pas. Avec l’approche par blocs modulaires, c’est le bloc lui-même qui gère ses propres assets. En conséquence, pas d’enqueue global, pas de surcharge inutile — juste ce qui est visible.
En termes de Core Web Vitals, la différence est significative. Le First Contentful Paint et le Largest Contentful Paint s’améliorent mécaniquement puisque le navigateur a moins de CSS à parser avant d’afficher le contenu.
Les erreurs classiques quand on crée un thème WordPress custom
Après des dizaines de thèmes livrés, voici les pièges dans lesquels je vois régulièrement tomber des développeurs (et dans lesquels je suis moi-même tombé à mes débuts) :
- Mélanger les architectures : si vous utilisez Sage, adoptez sa logique à 100%. Ne créez pas de fichier
header.phpclassique à côté de vos layouts Blade, ça finit toujours en désordre - Un CSS global monolithique : même sans Sage, pensez modulaire. Chargez uniquement les styles nécessaires à chaque page ou bloc
- Ignorer l’échappement : chaque donnée affichée doit passer par
esc_html(),esc_attr()ouwp_kses()— c’est vital pour la sécurité de votre site WordPress - Hardcoder les URLs : utilisez toujours les fonctions natives de WordPress pour générer vos liens
- Négliger Composer : sur un projet Bedrock, toutes vos dépendances (plugins, thème parent, packages PHP) doivent passer par Composer. Pas de download manuel de plugins dans le FTP
Mon workflow pour développer un thème WordPress custom
Voici les outils que j’utilise au quotidien pour mes projets de thèmes sur mesure :
- Bedrock : la base de chaque projet, pour une structure propre et sécurisée
- Sage : le starter theme, avec Blade, les Service Providers et une architecture moderne
- ACF Pro : pour créer des blocs Gutenberg custom avec des champs flexibles
- Tailwind CSS : en complément du BEM par bloc, pour les utilitaires rapides
- Git + CI/CD : versionner et déployer automatiquement, c’est non négociable
- WP-CLI : indispensable pour gérer WordPress en ligne de commande
En outre, avoir un starter theme personnel que vous peaufinez de projet en projet est un vrai accélérateur. Au fil du temps, vous construisez une base solide avec vos blocs ACF récurrents, vos layouts Blade, et vos conventions CSS — ça vous fait gagner des heures sur chaque nouveau projet. Si vous voulez en savoir plus sur l’organisation en freelance, jetez un œil à mon article sur comment bien démarrer en freelance.
Créer un thème WordPress custom : et après ?
Une fois votre thème terminé, le travail ne s’arrête pas là. Testez-le sur différents navigateurs et en responsive. Vérifiez vos Core Web Vitals. Documentez votre code et vos blocs ACF — votre futur vous (ou le développeur qui reprendra le projet) vous remerciera 😄
Créer un thème WordPress custom, c’est investir du temps pour gagner en maîtrise, en performances et en liberté. Si vous avez un projet qui nécessite un développement sur mesure, n’hésitez pas à me contacter pour en discuter. Je serai ravi d’échanger sur votre besoin et de vous accompagner 🚀