Chapitre 8.5 — Blocs dynamiques (render PHP)
⏱️ TL;DR — Un bloc dynamique ne stocke pas de HTML : son
saverenvoienull(ou rien), et le HTML front est généré à chaque affichage par du PHP (render.phpdéclaré dansblock.json, ourender_callback). C’est le bon choix dès que le rendu dépend de données qui évoluent (un livre, des articles récents, un prix, l’utilisateur courant) — cela évite l’invalidation des blocs statiques et garde le contenu toujours à jour. Leeditreste en React ; seul le rendu front passe côté serveur.
🎯 Objectifs
- Distinguer bloc statique et dynamique (rappel + décision).
- Créer un bloc dynamique (
render.php+savenull). - Recevoir attributs, contenu et contexte dans le PHP de rendu.
- Sécuriser le rendu (échappement, ch. 7.7).
1. Statique vs dynamique : la décision
| Statique | Dynamique | |
|---|---|---|
| HTML front | figé dans post_content (save) | calculé à l’affichage (PHP) |
| Données évolutives | ❌ (invalidation si le rendu change) | ✅ toujours à jour |
| Exemples | paragraphe, citation, image | derniers articles, un livre du catalogue, panier, date |
save | retourne le HTML | retourne null |
Règle : contenu rédactionnel figé → statique ; contenu issu de données (une entité, une requête, l’état du site) → dynamique.
2. Déclarer le rendu PHP
Dans block.json, on pointe un fichier de rendu :
{
"name": "wpr/livre-une",
"attributes": { "livreId": { "type": "number" }, "afficherPrix": { "type": "boolean", "default": true } },
"render": "file:./render.php"
}Et save renvoie null (le bloc n’écrit pas de HTML) :
// src/save.js
export default function save() {
return null; // rendu géré par le serveur
}3. Le fichier render.php
WordPress exécute render.php à chaque affichage, en exposant $attributes, $content (les InnerBlocks rendus, ch. 8.6) et $block (l’objet bloc) :
<?php
// render.php — $attributes, $content, $block disponibles
$livre_id = isset( $attributes['livreId'] ) ? absint( $attributes['livreId'] ) : 0;
if ( ! $livre_id ) {
return; // rien à afficher
}
$titre = get_the_title( $livre_id );
$prix = get_post_meta( $livre_id, 'wpr_prix', true );
$url = get_permalink( $livre_id );
// useBlockProps() côté serveur : applique classes/aligns/supports
$wrapper = get_block_wrapper_attributes( array( 'class' => 'wpr-livre-une' ) );
?>
<div <?php echo $wrapper; // déjà échappé par le cœur ?>>
<a href="<?php echo esc_url( $url ); ?>">
<?php echo esc_html( $titre ); ?>
</a>
<?php if ( ! empty( $attributes['afficherPrix'] ) && $prix ) : ?>
<span class="prix"><?php echo esc_html( number_format_i18n( (float) $prix, 2 ) ); ?> €</span>
<?php endif; ?>
</div>Deux points clés :
get_block_wrapper_attributes()est l’équivalent PHP deuseBlockProps(): il applique les classes/alignements/supportssur l’élément racine. À utiliser pour que les réglages natifs (couleur, alignement) fonctionnent sur le front.- Échapper toutes les sorties (
esc_html,esc_url— ch. 7.7) : le rendu PHP est du code serveur, la sécurité s’applique pleinement.
⚠️ Piège — oublier
get_block_wrapper_attributes(). Sans lui, les supports (couleur de fond, alignementwide/full, espacement) déclarés dansblock.jsonne s’appliquent pas sur le front (les classes générées ne sont pas posées). C’est le pendant serveur de « oublieruseBlockProps».
4. Alternative : render_callback en PHP
Sans render.php, on peut enregistrer le bloc avec un callback :
register_block_type( __DIR__ . '/build', array(
'render_callback' => 'wpr_livre_une_render',
) );
function wpr_livre_une_render( $attributes, $content, $block ) {
// même logique, retourne une chaîne HTML
return '…';
}render.php (déclaré dans block.json) est la voie moderne et recommandée ; render_callback reste utile pour brancher une classe/méthode existante.
5. Un aperçu correct dans l’éditeur
Le edit (React) doit refléter le rendu, mais il tourne dans l’éditeur : pour afficher les données du livre choisi, il récupère ces données via @wordpress/data/api-fetch (ch. 8.7), ou via le composant ServerSideRender qui demande au serveur de rendre le bloc et l’affiche tel quel :
import ServerSideRender from '@wordpress/server-side-render';
<ServerSideRender block="wpr/livre-une" attributes={ attributes } />ServerSideRender garantit un aperçu identique au front (pratique), au prix d’un appel serveur à chaque changement. Pour une UX plus fluide, on reconstruit souvent l’aperçu en React à partir des données récupérées (ch. 8.7).
💡 Pour un dev React — Un bloc dynamique, c’est SSR par bloc : le
editest votre composant client (éditeur), lerender.phpest le rendu serveur (comme un Server Component qui lit la base à la requête).ServerSideRender≈ demander au serveur le HTML et l’injecter — pratique mais moins fluide qu’un rendu client à partir de données. Le pattern « éditeur = React, front = serveur » vous est familier ; ici il est explicite et séparé.
✏️ Exercices
- Un bloc affiche « les 3 derniers articles ». Statique ou dynamique ? Justifiez.
- Quel est l’équivalent PHP de
useBlockProps()et pourquoi est-il important ? - Quelles sont les variables disponibles dans
render.php?
✅ Solution
- Dynamique : la liste des « 3 derniers articles » évolue (nouvelles publications) ; un
savestatique figerait la liste au moment de l’insertion. Le rendu PHP recalcule à chaque affichage → toujours à jour, sans invalidation. get_block_wrapper_attributes(): il applique sur l’élément racine les classes/alignements/supports (couleur,wide/full, espacement) déclarés dansblock.json. L’oublier prive le front de ces réglages natifs.$attributes(les attributs du bloc),$content(les InnerBlocks rendus),$block(l’objet bloc/contexte).
🧠 Quiz de révision
1. Que renvoie le save d’un bloc dynamique ?
null : le HTML front est généré par le PHP (render.php/render_callback).
2. Où déclare-t-on le fichier de rendu PHP ?
Dans block.json : "render": "file:./render.php".
3. Pourquoi préférer un bloc dynamique pour des données évolutives ?
Pour éviter l’invalidation (statique) et garder un rendu toujours à jour (recalculé à l’affichage).
4. Quel appel applique les supports sur le front d’un bloc dynamique ?
get_block_wrapper_attributes() (équivalent serveur de useBlockProps).
5. À quoi sert ServerSideRender dans l’éditeur ?
À afficher, dans edit, un aperçu identique au front en demandant au serveur de rendre le bloc.
Chapitre suivant : InnerBlocks & composition.