Chapitre 6.5 — Créer un thème bloc (FSE)
⏱️ TL;DR — Un thème bloc (FSE) remplace les fichiers PHP par : un
style.css(en-tête), untheme.json(le design system, ch. 3.4), un dossiertemplates/(gabarits en HTML de blocs) etparts/(en-tête, pied). Pas de Boucle PHP à écrire : les gabarits utilisent des blocs de thème (Query Loop, Post Title…). C’est plus déclaratif, plus rapide à produire, et c’est la direction de WordPress. On construit ici le fil rougetheme-nextdev.
🎯 Objectifs
- Connaître la structure minimale d’un thème bloc.
- Écrire un
theme.jsonde base. - Créer des gabarits et parties en HTML de blocs.
- Comprendre ce qui remplace
functions.php/la Boucle.
1. Structure minimale
theme-nextdev/
├── style.css ← en-tête (déclare le thème)
├── theme.json ← design system (obligatoire de fait)
├── templates/
│ ├── index.html ← gabarit universel (obligatoire)
│ ├── single.html
│ └── page.html
├── parts/
│ ├── header.html
│ └── footer.html
├── functions.php ← optionnel (enqueue, supports, motifs…)
└── screenshot.pngUn thème bloc valide au minimum = style.css (en-tête) + templates/index.html. Mais en pratique, theme.json est indispensable (il pilote tout le design) et on ajoute des parties/gabarits.
style.css (identique à un thème classique, mais sans styles obligatoires) :
/*
Theme Name: NextDev
Version: 1.0.0
Requires at least: 6.4
Requires PHP: 8.1
Text Domain: theme-nextdev
*/2. theme.json : le cœur
Rappel (ch. 3.4) : theme.json déclare palette, typo, espacements, largeurs, supports, styles par défaut. Un exemple compact :
{
"version": 3,
"settings": {
"layout": { "contentSize": "720px", "wideSize": "1100px" },
"color": {
"palette": [
{ "slug": "primary", "color": "#3858e9", "name": "Primaire" },
{ "slug": "base", "color": "#ffffff", "name": "Fond" },
{ "slug": "contrast","color": "#111111", "name": "Texte" }
]
},
"typography": {
"fontSizes": [
{ "slug": "medium", "size": "1rem", "name": "Normal" },
{ "slug": "large", "size": "1.5rem", "name": "Grand" },
{ "slug": "x-large","size": "2.25rem","name": "Très grand" }
]
},
"spacing": { "units": ["px", "rem", "%", "vw", "vh"] },
"appearanceTools": true
},
"styles": {
"color": { "background": "var(--wp--preset--color--base)", "text": "var(--wp--preset--color--contrast)" },
"typography": { "lineHeight": "1.6" },
"elements": {
"link": { "color": { "text": "var(--wp--preset--color--primary)" } },
"button": { "color": { "background": "var(--wp--preset--color--primary)", "text": "#fff" } }
}
}
}appearanceTools: true active d’un coup les contrôles de bordures, dimensions, etc., dans l’éditeur.
💡 Pour un dev React —
theme.jsonest votre design tokens + config Tailwind réunis, en JSON. Les gabarits (ci-dessous) sont des arbres de composants sérialisés. Un thème bloc, c’est un système de design déclaratif + des compositions de blocs — beaucoup plus proche de votre façon de penser qu’un thème PHP classique. Souvent, on démarre un thème bloc plus vite qu’un thème classique.
3. Les gabarits en HTML de blocs
Un gabarit est un fichier .html contenant la sérialisation de blocs (ch. 3.1), avec les blocs de thème. templates/index.html minimal :
<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
<!-- wp:group {"tagName":"main","layout":{"type":"constrained"}} -->
<main class="wp-block-group">
<!-- wp:query {"queryId":1,"query":{"perPage":10,"postType":"post"}} -->
<div class="wp-block-query">
<!-- wp:post-template -->
<!-- wp:post-title {"isLink":true} /-->
<!-- wp:post-excerpt /-->
<!-- /wp:post-template -->
<!-- wp:query-pagination -->
<!-- wp:query-pagination-previous /-->
<!-- wp:query-pagination-next /-->
<!-- /wp:query-pagination -->
</div>
<!-- /wp:query -->
</main>
<!-- /wp:group -->
<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->wp:template-partinclutparts/header.html/parts/footer.html.wp:query+wp:post-template= la Boucle en blocs (le Query Loop, ch. 3.3) : plus de PHP à écrire.wp:post-title,wp:post-excerpt= les données du post courant.
parts/header.html :
<!-- wp:group {"layout":{"type":"flex","justifyContent":"space-between"}} -->
<div class="wp-block-group">
<!-- wp:site-title /-->
<!-- wp:navigation /-->
</div>
<!-- /wp:group -->⚠️ Piège — Écrire cette sérialisation à la main est fastidieux et source d’erreurs. La bonne méthode : composer le gabarit dans l’éditeur de site (Apparence → Éditeur), puis exporter ou copier le markup dans le fichier
.html. On code rarement ce HTML de blocs à la main ; on le génère via l’éditeur, puis on le versionne.
4. Ce qui remplace functions.php et la Boucle
| Thème classique | Thème bloc |
|---|---|
functions.php (supports, config) | En grande partie theme.json (config du design/éditeur) |
Boucle PHP (have_posts…) | Bloc Query Loop dans le gabarit |
header.php/footer.php | parts/header.html / parts/footer.html |
wp_nav_menu() | Bloc Navigation |
| Enqueue CSS du thème | theme.json + éventuel functions.php pour des assets/motifs |
functions.php reste utile dans un thème bloc pour : enregistrer des motifs/styles de blocs (ch. 6.6), enqueue d’assets spécifiques, supports non couverts par theme.json. Mais il est beaucoup plus léger.
5. Tester le thème bloc
- Activez-le ; ouvrez Apparence → Éditeur : vous éditez gabarits/parties/styles visuellement.
- Vérifiez que
templates/index.htmlexiste (sinon le thème n’a pas de filet de sécurité). - Ajustez
theme.jsonet observez l’effet dans l’onglet Styles. - Rappel (ch. 3.3) : les éditions faites dans l’éditeur sont stockées en base et surchargent vos fichiers — pour repartir des fichiers, Effacer les personnalisations.
✏️ Exercices
- Quels sont les fichiers/dossiers clés d’un thème bloc et à quoi sert chacun ?
- Comment obtient-on une liste paginée d’articles dans un gabarit bloc, sans PHP ?
- Quelle est la méthode recommandée pour produire le HTML de blocs d’un gabarit ?
✅ Solution
style.css(en-tête déclarant le thème),theme.json(design system : palette, typo, espacements, styles),templates/(gabarits en HTML de blocs, dontindex.htmlobligatoire),parts/(en-tête, pied réutilisables).functions.phpreste optionnel (motifs, styles, enqueue).- Avec le bloc Query Loop (
wp:query+wp:post-template) et sa pagination (wp:query-pagination) — la Boucle en blocs, sans écrire de PHP. - Composer le gabarit dans l’éditeur de site, puis exporter/copier le markup dans le fichier
.html— plutôt que d’écrire la sérialisation de blocs à la main.
🧠 Quiz de révision
1. Quel fichier remplace en grande partie functions.php dans un thème bloc ?
theme.json (config du design et de l’éditeur).
2. Où vivent les gabarits d’un thème bloc ?
Dans templates/*.html (HTML de blocs) ; les parties réutilisables dans parts/*.html.
3. Quel bloc remplace la Boucle PHP ?
Le bloc Query Loop (wp:query + wp:post-template).
4. Quel gabarit est obligatoire ?
templates/index.html (le filet de sécurité universel).
5. Comment inclure l’en-tête dans un gabarit ?
Avec un bloc wp:template-part pointant vers parts/header.html.
Chapitre suivant : Motifs, styles & parties de gabarit.