Chapitre 8.2 — Scaffolding : @wordpress/scripts & block.json
⏱️ TL;DR — On ne configure pas webpack à la main.
@wordpress/create-blockgénère un plugin de bloc complet en une commande, et@wordpress/scriptsfournit les scripts de build (wp-scripts build/start) préconfigurés (JSX, SCSS, minification, hot rebuild). Au cœur :block.json, le manifeste du bloc (nom, titre, attributs, supports, fichierseditorScript/style/render). WordPress litblock.jsonet enqueue automatiquement les bons assets, avec les dépendances déclarées dans un.asset.phpgénéré. C’est le pipeline moderne, proche d’un projet React classique.
🎯 Objectifs
- Générer un bloc avec
create-block. - Comprendre la structure produite et le rôle de
block.json. - Lancer le build (
start/build) et le rechargement. - Comprendre l’enqueue automatique via
block.json.
1. Générer un bloc en une commande
# Dans wp-content/plugins/
npx @wordpress/create-block wpr-livre-uneCela crée un plugin complet wpr-livre-une/ : en-tête de plugin, block.json, src/ (JS/SCSS), configuration de build via @wordpress/scripts. Le bloc est immédiatement fonctionnel (« Hello World »).
Pour l’ajouter à un plugin existant (comme wpr-books), on utilise --no-plugin ou on copie la structure src/ + block.json et on enregistre le bloc depuis le plugin (ch. 8.9).
npm install # installe @wordpress/scripts et les deps
npm run start # build en watch (dev) → rebuild à chaque sauvegarde
npm run build # build de production (minifié) → dossier build/💡 Pour un dev React —
create-blockest lecreate-next-appde Gutenberg : un starter opinionated avec build prêt.wp-scripts start= votre dev server / watch (rebuild auto),wp-scripts build= le build de prod. Vous retrouvez npm, un dossiersrc/, du JSX, du SCSS — un projet front familier, sans config webpack à écrire.
2. La structure générée
wpr-livre-une/
├── wpr-livre-une.php ← plugin : enregistre le bloc via block.json
├── block.json ← LE manifeste du bloc
├── package.json ← scripts (start/build) + deps @wordpress/*
├── src/
│ ├── index.js ← registerBlockType(metadata, { edit, save })
│ ├── edit.js ← composant edit
│ ├── save.js ← fonction save
│ ├── editor.scss ← styles éditeur uniquement
│ ├── style.scss ← styles front + éditeur
│ └── render.php ← (si bloc dynamique)
└── build/ ← généré (ne pas versionner : bundles + .asset.php)Le PHP du plugin se contente d’enregistrer le bloc à partir du dossier de build :
add_action( 'init', function () {
register_block_type( __DIR__ . '/build' ); // lit build/block.json
} );register_block_type() avec un chemin lit le block.json et branche tout (scripts, styles, attributs, render) automatiquement.
3. block.json : le manifeste
{
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "wpr/livre-une",
"title": "Livre à la une",
"category": "widgets",
"icon": "book",
"description": "Met en avant un livre du catalogue.",
"textdomain": "wpr-books",
"attributes": {
"livreId": { "type": "number" },
"afficherPrix": { "type": "boolean", "default": true }
},
"supports": {
"html": false,
"align": ["wide", "full"],
"color": { "background": true, "text": true },
"spacing": { "padding": true }
},
"editorScript": "file:./index.js",
"editorStyle": "file:./index.css",
"style": "file:./style-index.css",
"render": "file:./render.php"
}Champs clés :
name: identifiant uniquenamespace/slug(wpr/livre-une).attributes: l’état du bloc (types, défauts) — l’équivalent de props typées (ch. 8.3).supports: fonctionnalités natives activées (couleurs, alignement, espacement…) — gratuites, gérées par le cœur.editorScript/editorStyle/style: les assets, chargés automatiquement par WordPress seulement quand le bloc est présent.render: un fichier PHP pour un bloc dynamique (ch. 8.5).
⚠️ Piège — enqueue manuel inutile. Avec
block.json, vous n’enqueue rien à la main : WordPress chargeeditorScript/style/etc. quand c’est nécessaire (bloc présent sur la page). Tenter d’enqueue vous-même ces assets crée des doublons. Laissezblock.jsongérer.
4. Les dépendances et le .asset.php
wp-scripts build génère, à côté de chaque bundle, un fichier index.asset.php :
<?php return array('dependencies' => array('wp-blocks','wp-block-editor','wp-element','wp-i18n'), 'version' => 'a1b2c3');WordPress lit ces dépendances pour charger @wordpress/blocks, @wordpress/element, etc. avant votre bloc, et la version (hash) pour le cache-busting. Vous n’avez rien à déclarer : le build détecte les imports @wordpress/* et les traduit en handles (wp-blocks…). C’est l’enqueue moderne (ch. 6.4) automatisé.
5. Workflow de dev
npm run start(watch) pendant que vous codez.- Dans l’éditeur WordPress, insérez votre bloc, rechargez après un rebuild.
npm run buildavant de livrer (bundle minifié).- Ne versionnez pas
build/ninode_modules/; versionnezsrc/,block.json,package.json. (Un pipeline CI reconstruitbuild/.)
📚 Aller plus loin —
@wordpress/scriptsfournit aussilint-js,lint-css,format, ettest-unit-js(Jest) : un outillage complet (Partie 11). Vous pouvez ajouter TypeScript, du SCSS, des imports d’images — comme un projet front moderne.wp-scriptsmasque webpack, mais reste extensible si besoin.
✏️ Exercices
- Quelle commande génère un plugin de bloc prêt à l’emploi ?
- Que déclare
block.jsonet qu’est-ce que WordPress en fait automatiquement ? - Pourquoi ne versionne-t-on pas le dossier
build/?
✅ Solution
npx @wordpress/create-block <nom>: elle crée un plugin de bloc complet avec build préconfiguré (@wordpress/scripts).block.jsondéclare le manifeste du bloc : nom, titre, attributs, supports, et les fichiers d’assets/render. WordPress enregistre le bloc, enqueue automatiquement les bons scripts/styles (quand le bloc est présent) et lit les dépendances via le.asset.php.- Parce que
build/est généré à partir desrc/(comme un dossier de sortie de build) ; on versionne les sources et on reconstruit en CI/local. Le versionner alourdit le dépôt et crée des conflits.
🧠 Quiz de révision
1. Quel outil fournit le build préconfiguré d’un bloc ?
@wordpress/scripts (wp-scripts start/build), généralement via @wordpress/create-block.
2. Qu’est-ce que block.json ?
Le manifeste du bloc : nom, attributs, supports, assets et render — lu par register_block_type.
3. Comment WordPress charge-t-il les assets d’un bloc ?
Automatiquement d’après block.json (editorScript/style/…), seulement quand le bloc est présent sur la page.
4. À quoi sert le fichier .asset.php ?
À déclarer les dépendances (handles wp-*) et la version du bundle, pour l’enqueue et le cache-busting.
5. Comment enregistre-t-on un bloc depuis un chemin de build ?
register_block_type( __DIR__ . '/build' ) sur init (il lit le block.json du dossier).
Chapitre suivant : edit, save & attributs.