Projet Niveau 3 — Bloc « Livre à la une » + endpoint REST
⏱️ TL;DR — Vous entrez sur votre terrain : React. Vous ajoutez à
wpr-booksun bloc Gutenberg dynamique « Livre à la une » (sélection d’un livre dans l’InspectorControls, rendu serveur) et un endpoint REST customwpr/v1/books. Objectif : comprendre que Gutenberg, c’est du React, la mécaniqueblock.json/edit/save/render_callback, et comment exposer proprement des données via l’API REST — la passerelle vers le headless du Niveau 4.
🎯 Niveau & objectifs
- Niveau : 3 (avancé). Prérequis : Niveau 2 (
wpr-booksopérationnel) ; Node.js 20+, npm ; bases React. - Durée indicative : 8–12 h.
- Vous allez pratiquer :
@wordpress/scripts,block.json,edit/save, blocs dynamiques (render_callback),InspectorControls,useSelect/@wordpress/data,register_rest_route, permissions REST.
📋 Cahier des charges
Contexte — La librairie veut mettre en avant un livre sur n’importe quelle page, avec un rendu soigné et toujours à jour. Et l’équipe front (vous, Niveau 4) a besoin d’une API propre pour consommer le catalogue.
Objectif — Livrer (a) un bloc éditeur en React qui laisse choisir un livre et l’affiche, et (b) un endpoint REST dédié au catalogue.
Périmètre inclus
- Un bloc dynamique
wpr/featured-bookscaffoldé avec@wordpress/create-block(oublock.jsonmanuel). edit.js: unInspectorControlsavec un sélecteur de livre (récupération viauseSelectsur le storecore).- Rendu dynamique :
saverenvoienull, le HTML est produit par unrender_callbackPHP (données toujours fraîches). - Attributs du bloc :
bookId, et une option d’affichage (montrer le prix ou non). - Un endpoint REST
GET /wp-json/wpr/v1/books: liste paginée (id, titre, genre, isbn, prix, lien), avec paramètresgenreetper_page. - Un endpoint
GET /wp-json/wpr/v1/books/<id>pour un livre unique. permission_callbackexplicite sur chaque route (lecture publique assumée et justifiée).- Build de production propre (
npm run build), assets enregistrés viablock.json.
Périmètre exclu — Pas de front Next.js (Niveau 4), pas d’écriture via REST (lecture seule), pas de WooCommerce.
Contraintes
- Le bloc doit être dynamique (pas de HTML figé dans le contenu du post).
- L’endpoint REST n’expose que les champs voulus (pas de fuite de meta privées).
permission_callbackjamais absent (ne jamais laisser__return_truesans y avoir réfléchi).
Livrables
- Le plugin
wpr-booksenrichi (bloc + REST), buildé. - Un court
README: comment builder, où est l’endpoint, exemples de réponses JSON.
✅ Critères de réussite
- Le bloc « Livre à la une » s’insère et propose de choisir un livre dans le panneau latéral.
- Modifier le prix du livre en base met à jour l’affichage du bloc sans ré-éditer la page (preuve du rendu dynamique).
-
GET /wp-json/wpr/v1/books?genre=roman&per_page=5renvoie un JSON propre et paginé. -
GET /wp-json/wpr/v1/books/<id>renvoie le bon livre ou un 404 REST correct. - Aucune meta privée ne fuit dans les réponses.
-
npm run buildproduit des assets chargés viablock.json.
🗺️ Endroits à visiter
| Endroit | Où | Pourquoi y aller |
|---|---|---|
@wordpress/create-block | terminal | Le scaffolder officiel ; lisez ce qu’il génère |
block.json (schéma) | Block Editor Handbook | Le manifeste : attributes, supports, render |
InspectorControls / @wordpress/components | storybook WP | Les composants React officiels (PanelBody, SelectControl…) |
@wordpress/data (store core) | Data Handbook | useSelect pour lire les livres dans l’éditeur |
/wp-json/ explorer | navigateur | Naviguez l’API : namespaces, routes, schémas |
register_rest_route (doc) | REST Handbook | Routes, args, permission_callback |
Core : wp-includes/rest-api/ | filesystem | Voir comment le core déclare ses endpoints |
💡 Pour un dev React — Vous êtes chez vous :
edit.jsest un composant React avec des hooks (useSelect,useBlockProps),InspectorControlsest un portail vers la sidebar, etblock.jsonest le manifeste du composant (comme unpackage.jsonde bloc). La seule vraie nouveauté : le bloc dynamique, oùsavene rend rien et c’est PHP (render_callback) qui produit le HTML final — pour que la donnée reste fraîche côté serveur. Gardez ce modèle en tête, il explique pourquoi Gutenberg n’est pas « juste un éditeur ».
⚠️ Piège — Ne mettez jamais
'permission_callback' => '__return_true'par réflexe : c’est le trou de sécurité n°1 des endpoints custom. Même en lecture publique, écrivez-le explicitement et demandez-vous qui doit pouvoir lire quoi.
🚀 Étapes suggérées
npx @wordpress/create-block(oublock.jsonmanuel) dans le plugin.edit.jsstatique d’abord (affiche « Livre à la une »), vérifier l’insertion.- Ajouter
InspectorControls+SelectControlalimenté paruseSelect. - Passer le bloc en dynamique :
save → null,render_callbackPHP. - Créer le namespace REST
wpr/v1+ routebooks(liste). - Ajouter la route
books/<id>+permission_callback. - Nettoyer les champs exposés ; tester dans le navigateur.
🎁 Bonus
- Ajoutez un contrôle de couleur au bloc via
supports(color,typography). - Mettez en cache la réponse REST liste (transient) et invalidez-la sur
save_post. - Ajoutez un endpoint d’écriture protégé par capability (préparez le terrain produit).
🔗 Chapitres du cours liés
Projet suivant : Niveau 4 — HeadlessShelf, front Next.js.