Skip to Content

Chapitre 8.1 — Gutenberg pour un dev React

⏱️ TL;DR — L’éditeur de blocs est une application React. Un bloc est un composant : sa fonction edit rend l’aperçu dans l’éditeur, sa fonction save (ou un rendu PHP) produit le HTML final. WordPress fournit son propre écosystème de paquets @wordpress/* (element = React, blocks, components, data, block-editor, i18n) : c’est du React, avec des noms différents. Vous partez donc avec un avantage énorme — les concepts (JSX, props, état, hooks) sont identiques ; il faut surtout apprendre le vocabulaire et les API maison.

🎯 Objectifs

  • Comprendre qu’un bloc est un composant React (edit/save).
  • Traduire les paquets @wordpress/* en équivalents React connus.
  • Repérer les différences (pas de import React, @wordpress/element, JSX via build).
  • Situer les briques que les chapitres suivants détaillent.

1. Un bloc = un composant

Développer un bloc, c’est fournir :

  • une définition (block.json : nom, attributs, supports…) ;
  • une fonction edit : un composant React qui rend l’aperçu dans l’éditeur (interactif, avec réglages) ;
  • une fonction save : ce qui est sérialisé dans le contenu (HTML statique), ou un rendu dynamique en PHP (ch. 8.5).

2. Les paquets @wordpress/* (votre dictionnaire)

WordPress a « re-packagé » React et un écosystème d’outils. Traduction :

Paquet WordPressÉquivalent que vous connaissez
@wordpress/elementReact (createElement, useState, useEffect, Fragment). WordPress ré-exporte React sous ce nom.
@wordpress/blocksL’API d’enregistrement de blocs (registerBlockType).
@wordpress/block-editorComposants liés à l’éditeur (RichText, InspectorControls, useBlockProps, InnerBlocks).
@wordpress/componentsUne bibliothèque de composants UI (Panel, ToggleControl, Button, ComboboxControl…) — votre « design system » d’admin.
@wordpress/dataUn store global façon Redux (useSelect, useDispatch).
@wordpress/i18n__() en JavaScript (i18n, ch. 7.8).
@wordpress/api-fetchUn fetch pré-configuré (nonce, base REST) façon axios maison.

💡 Pour un dev React — Mentalement : @wordpress/element est React, @wordpress/components est votre librairie de composants (comme MUI/Chakra), @wordpress/data est votre store (comme Redux/Zustand), @wordpress/api-fetch est votre client HTTP. Vous ne réapprenez pas React ; vous apprenez les noms et quelques conventions. 80 % de vos réflexes s’appliquent directement.


3. Les différences à connaître

  • Pas d’import React from 'react' : on importe depuis @wordpress/element (ou on laisse le build injecter le JSX pragma). En pratique, avec @wordpress/scripts (ch. 8.2), le JSX « marche » sans config.
  • JSX transpilé par le build : @wordpress/scripts fournit webpack + Babel préconfigurés. Vous écrivez du .js/.jsx moderne, il produit le bundle et un fichier .asset.php qui déclare les dépendances (wp-element, wp-blocks…) pour l’enqueue automatique.
  • Deux rendus : edit (éditeur) et save/PHP (front). Un bloc statique doit que son save corresponde au HTML stocké (sinon « invalidation », ch. 3.1) → beaucoup de blocs « à données » sont dynamiques (rendu PHP) pour éviter ça.
  • Le contexte éditeur : dans edit, vous avez accès aux données de WordPress (le post courant, ses meta, les entités) via @wordpress/data (ch. 8.7) — pas via des props passées manuellement.

4. Un aperçu de code (pour situer)

Un bloc statique minimal (détaillé au ch. 8.3) :

import { registerBlockType } from '@wordpress/blocks'; import { useBlockProps, RichText } from '@wordpress/block-editor'; import { __ } from '@wordpress/i18n'; import metadata from './block.json'; registerBlockType( metadata.name, { edit( { attributes, setAttributes } ) { const blockProps = useBlockProps(); return ( <div { ...blockProps }> <RichText tagName="h3" value={ attributes.titre } onChange={ ( titre ) => setAttributes( { titre } ) } placeholder={ __( 'Titre…', 'wpr-books' ) } /> </div> ); }, save( { attributes } ) { const blockProps = useBlockProps.save(); return <RichText.Content tagName="h3" value={ attributes.titre } { ...blockProps } />; }, } );

Vous reconnaissez tout : composant, props (attributes), handler (onChangesetAttributes, l’équivalent d’un setState), JSX. Le vocabulaire (useBlockProps, RichText, setAttributes) est la seule nouveauté.


5. Le plan de la partie

On avance ainsi : scaffolding (ch. 8.2) pour ne pas configurer le build à la main → edit/save/attributs (8.3) → contrôles (8.4) → dynamique (8.5) → composition (8.6) → data stores (8.7) → variations/styles (8.8) → tutoriel (8.9). À la fin, vous saurez livrer un bloc réel, branché sur wpr-books.


✏️ Exercices

  1. Reliez chaque paquet à son équivalent : @wordpress/element, @wordpress/data, @wordpress/components, @wordpress/api-fetch.
  2. Quelles sont les deux fonctions clés d’un bloc, et que produit chacune ?
  3. Pourquoi de nombreux blocs « à données » sont-ils rendus en PHP (dynamiques) plutôt qu’avec save ?

✅ Solution

  1. @wordpress/elementReact ; @wordpress/data → un store global (Redux/Zustand) ; @wordpress/components → une librairie de composants UI (MUI/Chakra) ; @wordpress/api-fetch → un client HTTP pré-configuré (axios maison).
  2. edit : un composant React qui rend l’aperçu dans l’éditeur ; save : le HTML sérialisé stocké dans le contenu (ou remplacé par un rendu PHP dynamique).
  3. Parce qu’un bloc statique exige que son save corresponde au HTML stocké : changer le rendu invalide les anciens contenus. Le dynamique (PHP) recalcule à l’affichage → pas d’invalidation, et données toujours à jour.

🧠 Quiz de révision

1. L’éditeur de blocs est écrit en quoi ?

En React (exposé via @wordpress/element).

2. Que fait la fonction edit d’un bloc ?

Elle rend l’aperçu interactif dans l’éditeur (c’est un composant React).

3. Quel paquet correspond à une librairie de composants UI ?

@wordpress/components (Panel, ToggleControl, Button…).

4. Où importe-t-on React dans un bloc ?

Depuis @wordpress/element (pas react directement) ; avec @wordpress/scripts, le JSX fonctionne sans config.

5. setAttributes est l’équivalent de quoi en React ?

D’un setState : il met à jour les attributs (l’état) du bloc.


Chapitre suivant : Scaffolding : @wordpress/scripts & block.json.