Blog
Maîtriser les blocs dynamiques WordPress : Connecter PHP et JavaScript pour un contenu interactif
Apprenez à créer des blocs WordPress dynamiques qui exploitent à la fois PHP et JavaScript pour offrir des expériences de contenu interactives et pilotées par les données à vos utilisateurs.

Résumé
Les blocs dynamiques WordPress offrent un moyen puissant de créer du contenu qui va au-delà du HTML statique, permettant l'intégration de données en temps réel et des éléments interactifs. Contrairement aux blocs statiques, les blocs dynamiques rendent leur sortie côté serveur à l'aide de PHP, ce qui leur permet de récupérer et d'afficher des informations à jour. Cet article fournit un guide pratique pour développer vos propres blocs dynamiques, couvrant les concepts essentiels de l'enregistrement des blocs, des rappels de rendu côté serveur et de la gestion des attributs côté client. Nous allons parcourir un exemple étape par étape, démontrant comment construire un bloc dynamique qui affiche les articles récents, offrant une base pour des composants interactifs plus complexes.
Maîtriser les blocs dynamiques WordPress : Connecter PHP et JavaScript pour un contenu interactif
WordPress, à la base, est un système de gestion de contenu (CMS) robuste construit sur une architecture PHP modulaire et une base de données MySQL. Son extensibilité est une force clé, principalement réalisée grâce aux thèmes et aux plugins. L'avènement de Gutenberg, l'éditeur de blocs, a révolutionné la création de contenu en introduisant une interface modulaire pilotée par JavaScript. Bien que les blocs Gutenberg statiques soient excellents pour le contenu structuré et immuable, de nombreux scénarios réels exigent un contenu dynamique, interactif et piloté par les données. C'est là qu'interviennent les blocs dynamiques, offrant un pont puissant entre la logique côté serveur de PHP et l'interactivité côté client de JavaScript.
Comprendre la puissance des blocs dynamiques
Les blocs statiques, par défaut dans Gutenberg, génèrent du HTML côté client lors de leur enregistrement. Ce HTML est ensuite stocké directement dans le contenu de l'article. Bien qu'efficace pour le contenu statique, cette approche a des limites lorsqu'il s'agit de données qui changent fréquemment ou nécessitent un traitement côté serveur. Les blocs dynamiques, en revanche, résolvent ce problème en rendant leur sortie côté serveur à l'aide de PHP. Lorsqu'un utilisateur consulte une page contenant un bloc dynamique, WordPress exécute une fonction PHP (le render_callback) pour générer le HTML du bloc à la volée. Cela permet au bloc de récupérer des données en temps réel à partir de la base de données, d'interagir avec d'autres fonctionnalités WordPress et de présenter des informations toujours à jour.
Ce rendu côté serveur est crucial pour plusieurs raisons :
- Données en temps réel : Affichage des derniers articles, des événements à venir, des cours de bourse ou de toute autre donnée qui change fréquemment.
- Logique complexe : Effectuer des calculs, interroger des types d'articles personnalisés ou s'intégrer à des API externes avant de rendre la sortie.
- Sécurité : Nettoyer et valider les données avant qu'elles ne soient affichées, en particulier lorsqu'il s'agit de contenu généré par l'utilisateur ou de sources externes.
- Performance : Décharger les tâches de rendu complexes vers le serveur peut parfois améliorer les performances côté client.
L'anatomie d'un bloc dynamique
Un bloc dynamique, comme tout autre bloc Gutenberg, est défini par ses métadonnées et son enregistrement JavaScript. Cependant, sa caractéristique unique réside dans l'attribut render_callback spécifié lors de l'enregistrement. Cette fonction de rappel est responsable de la génération de la sortie HTML du bloc sur le serveur.
Voici une répartition des composants clés :
- Enregistrement du bloc (JavaScript) : Vous devez toujours enregistrer votre bloc à l'aide de
registerBlockType()dans votre fichier JavaScript. Cela indique à Gutenberg que votre bloc existe et comment gérer ses attributs et son interface d'édition. - Attributs : Ce sont les champs de données associés à votre bloc, stockés dans le contenu de l'article. Pour les blocs dynamiques, les attributs sont principalement utilisés pour configurer le comportement et les paramètres du bloc dans l'éditeur. Le contenu réel affiché est généré par le
render_callback. render_callback(PHP) : C'est le cœur d'un bloc dynamique. Il s'agit d'une fonction PHP qui reçoit les attributs du bloc en argument et renvoie la chaîne HTML à rendre sur le front-end.- Interface d'édition (JavaScript) : Vous continuerez à construire l'interface du bloc dans l'éditeur Gutenberg à l'aide de composants React. Cette interface permet aux utilisateurs de configurer les attributs du bloc et de voir un aperçu (souvent une représentation simplifiée) de ce à quoi ressemblera le contenu dynamique.
Étape par étape : Création d'un bloc dynamique "Articles récents"
Créons un exemple pratique : un bloc dynamique qui affiche une liste des articles les plus récents de votre site WordPress.
Prérequis :
- Un environnement de développement WordPress local.
- Compréhension de base de PHP et JavaScript.
- Un plugin ou un thème où vous ajouterez le code de votre bloc.
Étape 1 : Configuration de votre plugin/thème de bloc
Si vous n'avez pas de plugin ou de thème personnalisé, créez-en un simple. Pour cet exemple, nous supposerons que vous l'ajoutez à un plugin.
Étape 2 : Enregistrement du bloc (JavaScript)
Dans le fichier JavaScript de votre plugin (par exemple, src/index.js), vous enregistrerez le bloc. Nous utiliserons @wordpress/blocks et @wordpress/i18n pour l'internationalisation.
// src/index.js
import { registerBlockType } from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
// Importez le composant d'édition de votre bloc
import Edit from './edit';
registerBlockType( 'my-dynamic-blocks/recent-posts', {\n title: __( 'Articles récents', 'my-dynamic-blocks' ),\n icon: 'list-view',\n category: 'widgets',\n attributes: {\n numberOfPosts: {\n type: 'number',\n default: 5,\n },
showExcerpt: {
type: 'boolean',
default: true,
},
},
edit: Edit,
// La fonction save() N'EST PAS nécessaire pour les blocs dynamiques
// Le render_callback côté serveur gérera la sortie
} );
Étape 3 : Création du composant d'édition (JavaScript)
Maintenant, créez le fichier src/edit.js. Ce composant définira l'apparence et le comportement du bloc dans l'éditeur Gutenberg.
// src/edit.js
import { useBlockProps, InspectorControls } from '@wordpress/block-editor';
import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import ServerSideRender from '@wordpress/server-side-render';
export default function Edit( { attributes, setAttributes } ) {
const blockProps = useBlockProps();
const { numberOfPosts, showExcerpt } = attributes;
return (
<div { ...blockProps }>
<InspectorControls>
<PanelBody title={ __( 'Paramètres de l'article', 'my-dynamic-blocks' ) }>
<RangeControl
label={ __( 'Nombre d'articles', 'my-dynamic-blocks' ) }
value={ numberOfPosts }
onChange={ ( value ) => setAttributes( { numberOfPosts: value } ) }
min={ 1 }
max={ 10 }
/>
<ToggleControl
label={ __( 'Afficher l'extrait', 'my-dynamic-blocks' ) }
checked={ showExcerpt }
onChange={ ( value ) => setAttributes( { showExcerpt: value } ) }
/>
</PanelBody>
</InspectorControls>
{
// Utilisez ServerSideRender pour afficher un aperçu du bloc dynamique
<ServerSideRender
block="my-dynamic-blocks/recent-posts"
attributes={ attributes }
/>
}
</div>
);
}
Notez que nous ne définissons PAS de fonction save(). C'est la différence clé pour les blocs dynamiques. Le composant ServerSideRender est utilisé pour afficher un aperçu de la sortie du bloc directement dans l'éditeur, en effectuant une requête au serveur.
Étape 4 : Mise en file d'attente des scripts et enregistrement du rendu côté serveur (PHP)
Dans le fichier PHP principal de votre plugin (par exemple, my-dynamic-blocks.php), vous devez mettre en file d'attente votre fichier JavaScript et enregistrer le type de bloc, y compris le render_callback.
<?php
/**
* Nom du plugin : My Dynamic Blocks
* Description : Un plugin simple pour les blocs Gutenberg dynamiques.
* Version : 1.0
* Auteur : Votre Nom
*/
function my_dynamic_blocks_register_block() {
// Enregistre le type de bloc
register_block_type( 'my-dynamic-blocks/recent-posts', array(
'editor_script' => 'my-dynamic-blocks-editor-script',
'render_callback' => 'my_dynamic_blocks_render_recent_posts',
'attributes' => array(
'numberOfPosts' => array(
'type' => 'number',
'default' => 5,
),
'showExcerpt' => array(
'type' => 'boolean',
'default' => true,
),
),
) );
}
add_action( 'init', 'my_dynamic_blocks_register_block' );
function my_dynamic_blocks_enqueue_editor_scripts() {
wp_enqueue_script(
'my-dynamic-blocks-editor-script',
plugins_url( 'build/index.js', __FILE__ ), // Supposant que vous avez un processus de build
array( 'wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-i18n', 'wp-server-side-render' ),
filemtime( plugin_dir_path( __FILE__ ) . 'build/index.js' )
);
}
add_action( 'enqueue_block_editor_assets', 'my_dynamic_blocks_enqueue_editor_scripts' );
/**
* Rappel de rendu pour le bloc dynamique d'articles récents.
*
* @param array $attributes Attributs du bloc.
* @return string Sortie HTML.
*/
function my_dynamic_blocks_render_recent_posts( $attributes ) {
$number_of_posts = isset( $attributes['numberOfPosts'] ) ? (int) $attributes['numberOfPosts'] : 5;
$show_excerpt = isset( $attributes['showExcerpt'] ) ? (bool) $attributes['showExcerpt'] : true;
$args = array(
'posts_per_page' => $number_of_posts,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'ignore_sticky_posts' => true,
);
$recent_posts_query = new WP_Query( $args );
$output = '';
if ( $recent_posts_query->have_posts() ) {
$output .= '<ul class="wp-block-my-dynamic-blocks-recent-posts">'; // Utiliser une classe pour le style
while ( $recent_posts_query->have_posts() ) {
$recent_posts_query->the_post();
$output .= '<li>';
$output .= '<a href="' . esc_url( get_permalink() ) . '">' . esc_html( get_the_title() ) . '</a>';
if ( $show_excerpt ) {
$output .= '<p>' . get_the_excerpt() . '</p>';
}
$output .= '</li>';
}
$output .= '</ul>';
wp_reset_postdata(); // Important : réinitialiser les données de l'article après la boucle personnalisée
} else {
$output = '<p>' . __( 'Aucun article trouvé.', 'my-dynamic-blocks' ) . '</p>';
}
return $output;
}
Explication du code PHP :
my_dynamic_blocks_register_block(): Cette fonction s'accroche àinitpour enregistrer notre type de bloc. De manière cruciale, elle définit lerender_callbackcommemy_dynamic_blocks_render_recent_postset transmet également les attributs du bloc, reflétant ce qui est défini dans JavaScript.my_dynamic_blocks_enqueue_editor_scripts(): Cette fonction s'accroche àenqueue_block_editor_assetspour charger notre fichier JavaScript spécifiquement pour l'éditeur. Elle inclutwp-server-side-rendercomme dépendance.my_dynamic_blocks_render_recent_posts(): C'est notrerender_callback. Elle reçoit le tableau$attributes, les nettoie et les convertit dans les types corrects, puis utiliseWP_Querypour récupérer les articles récents. Elle construit une liste HTML<ul>et la renvoie.wp_reset_postdata()est essentiel après une boucleWP_Querypersonnalisée pour éviter les conflits avec la requête WordPress principale.
Étape 5 : Compiler votre JavaScript
Si vous utilisez un processus de compilation JavaScript moderne (comme @wordpress/scripts), vous devrez compiler vos ressources. Exécutez npm run build (ou yarn build) dans le répertoire de votre plugin.
Étape 6 : Activer et tester
Activez votre plugin. Maintenant, lorsque vous ajoutez le bloc 'Articles récents' à un article ou une page, vous verrez l'interface de l'éditeur. La zone d'aperçu affichera la sortie rendue par votre rappel PHP. Lorsque vous publiez ou mettez à jour l'article, le même rappel PHP s'exécutera sur le front-end pour afficher le contenu dynamique.
Meilleures pratiques et mises en garde
- La sécurité avant tout : Nettoyez et validez toujours toutes les données provenant des attributs ou de sources externes avant de les utiliser dans votre
render_callback. Utilisez des fonctions WordPress commeesc_html(),esc_url(),sanitize_text_field(), etc. wp_reset_postdata(): Si votrerender_callbackutiliseWP_Queryou modifie l'objet global$post, appelez toujourswp_reset_postdata()ensuite pour restaurer la requête et les données de l'article d'origine.- Considérations de performance : Bien que les blocs dynamiques soient puissants, un rendu côté serveur excessif ou complexe peut avoir un impact sur les temps de chargement des pages. Optimisez vos requêtes et votre logique de rendu. Envisagez des mécanismes de mise en cache si les performances deviennent un problème.
- Aperçu de l'éditeur : Le composant
ServerSideRenderfournit un bon aperçu, mais il repose sur une requête serveur. Pour des blocs très complexes, cela peut ne pas être instantané. Assurez-vous que votrerender_callbackest efficace. - Gestion des attributs : Les attributs servent principalement à configurer le bloc dans l'éditeur. Le
render_callbackest responsable de la récupération et de l'affichage du contenu dynamique réel. Évitez de stocker de grandes quantités de données dynamiques directement dans les attributs. - Conventions de nommage : Utilisez des préfixes uniques pour les noms de vos blocs (par exemple,
mon-slug-plugin/nom-bloc) et les noms de fonctions PHP afin d'éviter les conflits avec d'autres plugins ou thèmes. - Internationalisation : Utilisez
__()et_n()pour les chaînes traduisibles dans votre code JavaScript et PHP.
Au-delà des articles récents : Expansion des capacités des blocs dynamiques
L'exemple des "Articles récents" n'est que la partie émergée de l'iceberg. Vous pouvez exploiter les blocs dynamiques pour :
- Afficher des types d'articles personnalisés : Présenter des produits, des éléments de portfolio ou des événements.
- Contenu spécifique à l'utilisateur : Afficher du contenu pertinent pour l'utilisateur connecté.
- Formulaires interactifs : Bien que les formulaires complexes puissent toujours bénéficier de plugins dédiés, des formulaires dynamiques simples peuvent être créés.
- Visualisation de données : Récupérer des données d'une API et rendre des graphiques ou des diagrammes (bien que cela implique souvent des bibliothèques JavaScript plus avancées).
- Intégration avec d'autres plugins : Afficher dynamiquement des données gérées par d'autres plugins.
Conclusion
Les blocs dynamiques WordPress sont un outil indispensable pour les développeurs cherchant à créer des expériences véritablement interactives et pilotées par les données au sein de l'éditeur Gutenberg. En comprenant comment enregistrer des blocs avec des fonctions render_callback et gérer efficacement les attributs, vous pouvez créer des composants puissants qui récupèrent et affichent des informations en temps réel. Alors que les blocs statiques servent leur objectif pour le contenu structuré, les blocs dynamiques ouvrent un nouveau niveau de fonctionnalité, vous permettant de combler le fossé entre la logique côté serveur et la présentation front-end. En suivant les meilleures pratiques en matière de sécurité, de performance et d'organisation du code, vous pouvez développer en toute confiance des blocs dynamiques robustes et utiles qui améliorent vos sites Web WordPress.
Sources (5)
- WordPress Architecture: A Complete Guide - Liquid Web
- Explaining WordPress Hooks with Actions and Filters - Hey Reliable
- WordPress Hooks, Actions, and Filters: What They Do and How They Work
- Getting Started with Gutenberg: WordPress Block Development Essentials
- Gutenberg Block Development Step by Step Guide - White Label IQ