Gutenberg vous laisse-t-il encore perplexe ? Ou faites-vous partie de ceux qui croient fermement au potentiel de l’éditeur de blocs et qui veulent découvrir jusqu’où ils peuvent pousser leur créativité en utilisant l’éditeur de blocs ?

Quelle que soit la catégorie d’utilisateurs à laquelle vous appartenez, Gutenberg est là pour rester et cet article vous donnera un aperçu approfondi de ce qui se passe dans les coulisses de l’éditeur de bloc WordPress. Mais ce n’est pas tout !

Suite à notre précédent tutoriel où nous avons fourni une introduction générale au développement de blocs Gutenberg, cet article va au-delà des bases, en présentant des types de blocs plus avancés. Ces blocs sont désignés sous le nom de blocs dynamiques.

Aujourd’hui, vous allez apprendre ce que sont les blocs dynamiques, comment ils fonctionnent et tout ce que vous devez savoir pour créer des blocs dynamiques à partir de zéro.

Alors, que sont les blocs dynamiques de Gutenberg, et quelles sont les principales différences entre les blocs statiques et dynamiques ?

Que sont les blocs dynamiques ? Un exemple

Alors qu’avec les blocs statiques, le contenu est ajouté manuellement par l’utilisateur lors de la moficiation d’un article ou d’une page, avec les blocs dynamiques, le contenu est chargé et traité à la volée lors du chargement de la page. Avec les blocs dynamiques, le contenu du bloc est récupéré dans la base de données et affiché tel quel ou résultant de toute sorte de manipulation de données.

Expliquons cela à l’aide d’un exemple. Supposons que vous souhaitiez créer un groupe de blocs imbriqués affichant les détails de l’auteur de l’article avec une sélection des derniers articles du même auteur.

Un bloc de groupe comprenant l'auteur de l'article et les derniers articles
Un bloc de groupe comprenant l’auteur de l’article et les derniers articles

En tant qu’utilisateurs de Gutenberg, vous pourriez utiliser les blocs suivants :

  • Le bloc central Titre
  • Le bloc central Auteur de l’article
  • Le bloc central Derniers articles

Vous pourriez également créer un groupe incluant ces blocs et ajouter le groupe aux blocs réutilisables pour une utilisation future.

Ajout d'un groupe de blocs à des blocs réutilisables
Ajout d’un groupe de blocs à des blocs réutilisables

C’est assez simple, n’est-ce pas ? Vous pouvez créer un bloc dynamique et l’ajouter à vos articles et pages en un clin d’œil.

À partir de WordPress 5.9, l’éditeur de blocs propose plus de 90 blocs différents, et il y a de fortes chances que vous trouviez le bloc qui vous convient dès le départ. Et, si vous avez besoin de plus, faites une recherche rapide dans le répertoire des extensions WordPress et vous trouverez de nombreuses extensions gratuites fournissant des blocs supplémentaires.

Mais qu’en est-il si vous êtes un développeur WordPress – ou si vous envisagez une carrière de développeur WordPress? Peut-être avez-vous des besoins très spécifiques et ne trouvez pas le bloc que vous recherchez, ou vous voulez simplement acquérir de nouvelles compétences professionnelles. Dans de telles situations, vous pourriez vouloir apprendre à créer vos blocs dynamiques.

Les blocs dynamiques de Gutenberg du point de vue d’un développeur

Les blocs dynamiques ont deux cas d’utilisation principaux.

Le premier cas d’utilisation est lorsque vous devez mettre à jour le contenu d’un bloc alors que la page contenant le bloc n’a pas été mise à jour. Par exemple, cela se produit lorsque le bloc comprend une liste des derniers articles ou commentaires, et en général chaque fois que le contenu du bloc est généré dynamiquement à l’aide de données extraites de la base de données.

Ajout d'un bloc Query Loop
Ajout d’un bloc Query Loop

Le deuxième cas d’utilisation est lorsqu’une mise à jour du code du bloc doit être immédiatement affichée sur l’interface publique. En utilisant un bloc dynamique au lieu d’un bloc statique, les modifications sont immédiatement appliquées à toutes les occurrences du bloc.

En revanche, si vous modifiez le HTML produit par un bloc statique, l’utilisateur verra une boîte de dialogue d’invalidation jusqu’à ce que chaque instance de la version précédente du bloc soit supprimée et remplacée par la nouvelle version, ou que vous marquiez l’ancienne version comme étant dépréciée (voir également Dépréciation et validation du bloc, Dépréciation et expérience de migration).

Contenu inattendu ou non valide.
Contenu inattendu ou non valide.

Ceci étant dit, il y a quelques concepts que vous devez comprendre avant de pouvoir commencer à construire des blocs dynamiques.

État de l’application et stockage de données

Gutenberg est une application SPA React, et tout dans Gutenberg est un composant React. Le titre de l’article, les en-têtes, les paragraphes, les images et tout bloc de contenu HTML dans l’éditeur est un composant React, de même que les contrôles de la colonne d’outils latérale et des blocs.

Dans notre article précédent, nous avons uniquement utilisé les propriétés pour stocker des données. Dans cet article, nous allons aller un peu plus loin en introduisant le concept de state.

Pour faire simple, l’objet state est un objet JavaScript ordinaire utilisé pour contenir des informations sur un composant. Le state du composant peut changer au fil du temps, et chaque fois qu’il change, le composant se présente à nouveau.

Tout comme l’objet state, les propriétés sont des objets JavaScript ordinaires utilisés pour contenir des informations sur le composant. Mais il y a une différence essentielle entre les propriétés et state:

props sont transmises au composant (similaires aux paramètres de fonction) alors que state est géré au sein du composant (similaire aux variables déclarées dans une fonction).

Vous pouvez considérer l’état comme un instantané des données prises à un moment donné qu’une application stocke pour contrôler le comportement d’un composant. Par exemple, si la colonne latérale des réglages de l’éditeur de blocs est ouverte, une information sera stockée quelque part dans l’objet state.

Lorsque l’information est partagée au sein d’un seul composant, nous l’appelons état local. Lorsque l’information est partagée entre plusieurs composants au sein d’une application, nous l’appelons état d’application.

L’Application State est étroitement lié au concept de stockage. Selon la documentation de Redux:

Un stockage contient l’ensemble de l’arbre d’état de votre application. La seule façon de changer l’état à l’intérieur de celui-ci est de distribuer une action sur celui-ci.

Ainsi, Redux stocke l’état d’une application dans un seul arbre d’objets immuable (à savoir un stockage). L’arbre d’objets ne peut être modifié qu’en créant un nouvel objet à l’aide d’actions et de réducteurs.

Dans WordPress, les stockages sont gérés par le module de données de WordPress.

Modularité, paquets et stockages de données dans Gutenberg

Le référentiel de Gutenberg est construit de A à Z sur plusieurs modules réutilisables et indépendants qui, combinés ensemble, construisent l’interface d’édition. Ces modules sont également appelés paquets ou packages.

La documentation officielle répertorie deux types de paquets différents :

  • Les paquets de production constituent le code de production qui s’exécute dans le navigateur. Il existe deux types de paquets de production dans WordPress :
    • Les paquets avec des feuilles de style fournissent des feuilles de style pour fonctionner correctement.
    • Les paquets avec stockage de données définissent les stockages de données pour gérer leur état. Les paquets avec stockage de données peuvent être utilisés par des extensions et des thèmes tiers pour récupérer et manipuler des données.
  • Les paquets de développement sont utilisés en mode développement. Ces paquets comprennent des outils de linting, de test, de construction, etc.

Ici, nous nous intéressons surtout aux paquets avec des stockages de données, utilisés pour récupérer et manipuler des données.

Le stockage de données de WordPress

Le module de données de WordPress est construit sur Redux et partage les trois principes fondamentaux de Redux, avec toutefois quelques différences essentielles.

La documentation officielle fournit la définition suivante:

Le module de données de WordPress sert de hub pour gérer l’état de l’application à la fois pour les extensions et pour WordPress lui-même, en fournissant des outils pour gérer les données au sein et entre les modules distincts. Il est conçu comme un modèle modulaire d’organisation et de partage des données : suffisamment simple pour satisfaire les besoins d’une petite extension, tout en étant évolutif pour répondre aux exigences d’une application complexe à page unique.

Par défaut, Gutenberg enregistre plusieurs stockages de données dans l’état de l’application. Chacun de ces stockages a un nom et un but spécifiques :

Grâce à ces stockages, vous pourrez accéder à tout un tas de données :

  1. Données relatives à l’article actuel, telles que le titre de l’article, l’extrait, les catégories et les étiquettes, les blocs, etc.
  2. Données relatives à l’interface utilisateur, par exemple si une bascule est activée ou désactivée.
  3. Données relatives à l’ensemble de l’installation WordPress, telles que les taxonomies enregistrées, les types d’articles, le titre du blog, les auteurs, etc.

Ces stockages vivent dans l’objet global wp. Pour accéder à l’état d’un stockage, vous utiliserez la fonction select.

Pour voir comment cela fonctionne, créez un nouvel article ou une nouvelle page et lancez l’inspecteur de votre navigateur. Trouvez la console et saisissez la ligne de code suivante :

wp.data.select("core")

Le résultat sera un objet comprenant une liste de fonctions que vous pouvez utiliser pour obtenir des données du stockage de données core. Ces fonctions sont appelées sélecteurs et agissent comme des interfaces pour accéder aux valeurs d’état.

L'objet stockage de données du cœur de WordPress
L’objet stockage de données du cœur de WordPress

Le stockage de données de WordPress comprend des informations sur WordPress en général et les sélecteurs sont le moyen d’obtenir ces informations. Par exemple, getCurrentUser() renvoie les détails de l’utilisateur actuel :

wp.data.select("core").getCurrentUser()
Inspecter la réponse de getCurrentUser
Inspecter la réponse de getCurrentUser

Un autre sélecteur que vous pouvez utiliser pour récupérer les détails de l’utilisateur à partir du stockage de données est getUsers() :

wp.data.select("core").getUsers()

L’image suivante montre l’objet de la réponse :

Inspection de la réponse getUsers
Inspection de la réponse getUsers

Pour obtenir les détails d’un seul utilisateur, vous pouvez simplement saisir la ligne suivante :

wp.data.select("core").getUsers()[0]

En utilisant le même sélecteur, vous pouvez également récupérer les utilisateurs du site avec le rôle author attribué :

wp.data.select( 'core' ).getUsers({ who: 'authors' })

Vous pouvez également récupérer les taxonomies enregistrées :

wp.data.select("core").getTaxonomies()
Inspection de la réponse getTaxonomies.
Inspection de la réponse getTaxonomies.

Une liste des types de publications enregistrés :

wp.data.select("core").getPostTypes()

Ou une liste des extensions :

wp.data.select("core").getPlugins()

Essayons maintenant d’accéder à un stockage de données différent. Pour cela, vous utiliserez toujours la fonction select, mais en fournissant un espace de noms différent. Essayons ce qui suit :

wp.data.select("core/edit-post")

Maintenant, vous obtiendrez l’objet de réponse suivant.

Accéder aux données de l'interface utilisateur de l'éditeur
Accéder aux données de l’interface utilisateur de l’éditeur

Si vous voulez savoir si la colonne latérale des réglages est ouverte ou non, vous utiliserez le sélecteur isEditorSidebarOpened:

wp.data.select("core/edit-post").isEditorSidebarOpened()

Cette fonction renvoie true si la colonne latérale est ouverte :

La colonne latérale est ouverte.
La colonne latérale est ouverte.

Comment accéder aux données de l’article

Vous devriez maintenant avoir une compréhension de base de la façon d’accéder aux données. Nous allons maintenant nous intéresser de plus près à un sélecteur spécifique, la fonctiongetEntityRecords , qui est le sélecteur qui donne accès aux données de l’article.

Dans l’éditeur de bloc, faites un clic droit et sélectionnez Inspecter. Dans l’onglet Console, copiez et collez la ligne suivante :

wp.data.select("core").getEntityRecords('postType', 'post')

Ceci envoie une requête à l’API Rest et renvoie un tableau d’enregistrements correspondant aux derniers articles de blog publiés.

getEntityRecords renvoie une liste d'articles.
getEntityRecords renvoie une liste d’articles.

getEntityRecords accepte trois paramètres:

  • kind chaîne de caractères : Type d’entité (par exemple, postType).
  • name chaîne de caractères : Nom de l’entité (c.-à-d. post).
  • query ?objet : Requête de termes facultatifs (par exemple, {author: 0}).

Vous pouvez construire des demandes plus spécifiques en utilisant un objet d’arguments.

Par exemple, vous pouvez décider que la réponse ne doit contenir que les articles d’une catégorie spécifique :

wp.data.select("core").getEntityRecords('postType', 'post', {categories: 3})

Vous pouvez également demander uniquement les articles d’un auteur donné :

wp.data.select("core").getEntityRecords('postType', 'post', {author: 2})

Si vous cliquez sur l’un des enregistrements renvoyés par getEntityRecords, vous obtenez une liste de propriétés pour l’enregistrement sélectionné :

Un exemple de requête API avec getEntityRecords.
Un exemple de requête API avec getEntityRecords.

Si vous voulez que la réponse inclue l’image mise en avant, vous devrez ajouter un argument supplémentaire à votre requête précédente :

wp.data.select("core").getEntityRecords('postType', 'post', {author: 2, _embed: true})
Détails de l'image mise en avant dans la réponse getEntityRecords.
Détails de l’image mise en avant dans la réponse getEntityRecords.

Maintenant, vous devriez avoir une meilleure compréhension de la façon d’accéder au stockage de données de WordPress et de récupérer les détails des articles. Pour voir de plus près le sélecteur getEntityRecords, voir aussi Demander des données dans Gutenberg avec getEntityRecords.

Comment créer un bloc dynamique : Un exemple de projet

Après notre long préambule théorique, nous pouvons passer à la pratique et créer un bloc dynamique à l’aide des outils que nous avons présentés dans notre précédent tutoriel sur le développement de blocs.

Dans cet article, nous avons abordé les points suivants

  1. Comment configurer un environnement de développement WordPress
  2. Qu’est-ce qu’un échafaudage de bloc
  3. Comment construire un bloc statique Gutenberg

C’est pourquoi nous ne couvrirons pas ces sujets en profondeur dans le présent article, mais n’hésitez pas à vous référer à notre guide précédent pour toute information complémentaire, ou simplement pour vous rafraîchir la mémoire.

Configuration d’un environnement de développement JavaScript

Commençons par configurer un environnement de développement JavaScript.

Installez ou mettez à jour Node.js

Tout d’abord, installez ou mettez à jour Node.js. Une fois que vous avez terminé, lancez votre outil de ligne de commande et exécutez la commande suivante :

node -v

Vous devriez voir votre version de node.

Configurez votre environnement de développement

Ensuite, vous aurez besoin d’un environnement de développement pour WordPress. Pour nos exemples, nous avons utilisé DevKinsta, notre outil de développement WordPress gratuit qui vous permet de lancer un site WordPress local en un rien de temps.

Création d'un site personnalisé dans DevKinsta
Création d’un site personnalisé dans DevKinsta

Mais vous êtes toujours libre de choisir l’environnement de développement local WordPress de votre choix, comme MAMP ou XAMPP, ou même la solution officielle wp-env.

Si vous utilisez DevKinsta, cliquez sur Nouveau site WordPress ou sur Site personnalisé, remplissez les champs du formulaire et appuyez sur Créer un site.

Le processus d’installation prend une minute ou deux. Lorsqu’il est terminé, lancez votre site de développement WordPress local.

Écran Infos du site dans DevKinsta.
Écran Infos du site dans DevKinsta.

Configurez votre plugin de bloc

Ce dont vous avez besoin maintenant, c’est d’un extension de bloc de démarrage. Pour éviter tous les tracas d’une configuration manuelle, l’équipe de développeurs du cœur de WordPress a publié l’outil @wordpress/create-block, qui est l’outil officiel de configuration zéro pour la création de blocs Gutenberg.

Nous avons couvert @wordpress/create-block en profondeur dans notre article précédent, donc ici nous pouvons commencer la configuration tout de suite.

Dans votre outil de ligne de commande, allez dans le dossier /wp-content/plugins:

Nouveau terminal au dossier dans Mac OS.
Nouveau terminal au dossier dans Mac OS.

Une fois là, exécutez la commande suivante :

npx @wordpress/create-block

Vous êtes maintenant prêt à installer le paquet @wordpress/create-block:

Installation du paquet @wordpress/create-block.
Installation du paquet @wordpress/create-block.

Pour confirmer, saisissez y et appuyez sur Entrée.

Cela génère les fichiers PHP, SCSS et JS de l’extension en mode interactif.

Vous trouverez ci-dessous les détails que nous utiliserons dans notre exemple. N’hésitez pas à modifier ces détails en fonction de vos préférences :


Une fois que vous avez appuyé sur Entrée, l’extension est téléchargée et configurée.

Installation de l'extension de bloc.
Installation de l’extension de bloc.

Le processus peut prendre quelques minutes. Lorsqu’il est terminé, vous devriez voir l’écran suivant :

Block démarré dans le dossier de l'extension.
Block démarré dans le dossier de l’extension.

Vous verrez une liste des commandes que vous pouvez exécuter à partir du répertoire de l’extension :

  • $ npm start – Lancez la construction pour le développement.
  • $ npm run build – Construire le code pour la production.
  • $ npm run format – Formater les fichiers.
  • $ npm run lint:css – Lint les fichiers CSS.
  • $ npm run lint:js – Lint les fichiers JavaScript.
  • $ npm run packages-update – Mise à jour des paquets WordPress à la dernière version.

Ok, maintenant déplacez-vous dans le répertoire des extensions avec la commande suivante :

cd author-plugin

Et démarrez votre build de développement :

npm start

Ensuite, allez vers l’écran des extensions dans votre tableau de bord WordPress et activez l’extension Author box:

L'extension de bloc est listée dans l'écran Extensions.
L’extension de bloc est listée dans l’écran Extensions.

Vous pouvez maintenant vérifier si l’extension fonctionne correctement. Créez un nouvel article et commencez à saisir / pour lancer l’outil d’insertion rapide :

L'élément bloc dans l'outil d'insertion rapide.
L’élément bloc dans l’outil d’insertion rapide.

Vous trouverez également le bloc Boîte d’auteur dans l’outil d’insertion de blocs, sous la catégorie Widgets. Sélectionnez le bloc pour l’ajouter au canevas de l’éditeur :

L'outil d'insertion de blocs WordPress
L’outil d’insertion de blocs WordPress

Vous avez terminé. Maintenant, enregistrez l’article et prévisualisez la page pour vérifier si le bloc s’affiche correctement.

L’échafaudage de blocs

Nous avons couvert l’échafaudage de bloc dans notre article précédent. Nous ne ferons donc ici qu’un survol rapide des fichiers que nous allons modifier pour nos exemples.

Le dossier racine
Le dossier racine est l’endroit où vous trouverez le fichier PHP principal et plusieurs sous-dossiers.

author-plugin.php
Par défaut, le paquetage @wordpress/create-block fournit le fichier PHP suivant :

/**
 * Plugin Name:       Author box
 * Description:       An example block for Kinsta readers
 * Requires at least: 5.8
 * Requires PHP:      7.0
 * Version:           0.1.0
 * Author:            Carlo
 * License:           GPL-2.0-or-later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       author-plugin
 *
 * @package           author-box
 */

/**
 * Registers the block using the metadata loaded from the `block.json` file.
 * Behind the scenes, it registers also all assets so they can be enqueued
 * through the block editor in the corresponding context.
 *
 * @see https://developer.wordpress.org/reference/functions/register_block_type/
 */
function author_box_author_plugin_block_init() {
	register_block_type( __DIR__ . '/build' );
}
add_action( 'init', 'author_box_author_plugin_block_init' );

Dans l’en-tête, vous remarquerez les détails que nous avons saisis lors de la configuration.

Avec les blocs statiques, vous travaillerez la plupart du temps sur les fichiers JavaScript situés dans le dossier src. Avec les blocs dynamiques, vous écrirez du code PHP pour afficher le contenu du bloc sur l’interface publique.

Le dossier src
Le dossier src est votre dossier de développement. Vous y trouverez les fichiers suivants :

  • block.json
  • index.js
  • edit.js
  • save.js
  • editor.scss
  • style.scss

block.json
block.json est votre fichier de métadonnées. @wordpress/create-block génère le fichier block.json suivant :

{
	"$schema": "https://schemas.wp.org/trunk/block.json",
	"apiVersion": 2,
	"name": "author-box/author-plugin",
	"version": "0.1.0",
	"title": "Author box",
	"category": "widgets",
	"icon": "businessperson",
	"description": "An example block for Kinsta readers",
	"supports": {
		"html": false
	},
	"textdomain": "author-plugin",
	"editorScript": "file:./index.js",
	"editorStyle": "file:./index.css",
	"style": "file:./style-index.css"
}

Pour une vue plus détaillée du fichier block.json en général, veuillez vous reporter à notre précédent article de blog.

index.js
Le fichier index.js est l’endroit où vous enregistrez le type de bloc sur le client :

import { registerBlockType } from '@wordpress/blocks';

import './style.scss';

import Edit from './edit';
import save from './save';

registerBlockType('author-box/author-plugin', {
	edit: Edit,
	save,
});

edit.js
Le fichier edit.js est l’endroit où vous construirez l’interface de bloc rendue dans l’éditeur :

import { __ } from '@wordpress/i18n';

import { useBlockProps } from '@wordpress/block-editor';

import './editor.scss';

export default function Edit() {
	return (
		<p {...useBlockProps()}>
			{__('Author box – hello from the editor!', 'author-plugin')}
		</p>
	);
}

save.js
Le fichier save.js contient le script qui construit le contenu du bloc à enregistrer dans la base de données. Nous n’utiliserons pas ce fichier dans ce tutoriel :

import { __ } from '@wordpress/i18n';

import { useBlockProps } from '@wordpress/block-editor';

export default function save() {
	return (
		<p {...useBlockProps.save()}>
			{__('Author box – hello from the saved content!', 'author-plugin')}
		</p>
	);
}

Construire le bloc pour le rendre dans l’éditeur

Ouvrez votre projet dans Visual Studio Code ou tout autre éditeur de code que vous souhaitez.

Si vous utilisez Visual Studio Code, allez dans Terminal -> Nouveau terminal. Cela lancera une fenêtre de terminal sur le dossier racine de votre projet.

Dans le terminal (ou dans votre outil de ligne de commande préféré), saisissez la commande suivante :

npm start

Vous exécutez maintenant l’environnement node en mode développement.

Le projet d'extension de bloc dans Visual Studio Code.
Le projet d’extension de bloc dans Visual Studio Code.

À partir de maintenant, vous allez suivre deux voies différentes. Pour rendre le bloc dans l’éditeur, vous travaillerez dans le fichier edit.js. Pour rendre le bloc sur l’interface publique, vous devrez écrire du code PHP dans le fichier principal de l’extension.

Maintenant, retroussez vos manches car le codage commence :

Enregistrer le bloc sur le serveur

Tout d’abord, vous devez enregistrer le bloc sur le serveur et écrire le code PHP pour récupérer les données de la base de données.

Dans le fichier author-plugin.php, vous devrez passer un deuxième argument à la fonctionregister_block_type :

function author_box_author_plugin_block_init() {
	register_block_type( __DIR__ . '/build', array(
		'render_callback' => 'author_box_author_plugin_render_author_content'
	) );
}
add_action( 'init', 'author_box_author_plugin_block_init' );

Le deuxième argument est un tableau d’arguments pour l’enregistrement d’un type de bloc (voir la liste complète des arguments disponibles ici). Dans le code ci-dessus, nous avons uniquement fourni render_callback, qui détermine la fonction de rappel qui rend le bloc à l’écran.

Ensuite, vous allez déclarer la fonction :

function author_box_author_plugin_render_author_content() {
	return 'Hello World!';
}

Enregistrez le fichier, créez un nouvel article ou une nouvelle page, et ajoutez le bloc Author Box au canevas de l’éditeur.

L'outil d'insertion de bloc de WordPress.
L’outil d’insertion de bloc de WordPress.

L’éditeur de blocs affiche toujours le bloc de démarrage, car nous n’avons pas encore modifié le fichier edit.js.

Mais si vous prévisualisez l’article dans l’interface publique, vous verrez que le contenu du bloc d’origine a maintenant été remplacé par la chaîne « Hello World ».

Maintenant, puisque le HTML rendu sur l’interface publique est généré par le fichier PHP, il ne sera pas nécessaire que la fonction save renvoie quoi que ce soit. Passons donc directement au fichier save.js et modifions le code comme indiqué ci-dessous :

export default function save() {
	return null;
}

Définir les attributs du bloc

Vous avez maintenant besoin d’un endroit pour stocker les réglages de l’utilisateur. Par exemple, le nombre d’éléments de publication à récupérer dans la base de données, l’affichage ou non d’un champ spécifique, etc. Pour cela, vous allez définir un certain nombre d’attributes dans le fichier block.json.

Par exemple, vous pouvez donner à l’utilisateur la possibilité de déterminer le nombre d’articles à inclure dans le bloc, l’option d’afficher l’image mise en avant, la date, l’extrait, et/ou de masquer/afficher la photo de profil de l’auteur.

Voici la liste complète des attributs que nous utiliserons pour construire notre bloc d’exemple :

{
	...
	"attributes": {
		"numberOfItems": {
			"type": "number",
			"default": 3
		},
		"columns": {
			"type": "number",
			"default": 1
		},
		"displayDate": {
			"type": "boolean",
			"default": true
		},
		"displayExcerpt": {
			"type": "boolean",
			"default": true
		},
		"displayThumbnail": {
			"type": "boolean",
			"default": true
		},
		"displayAuthorInfo": {
			"type": "boolean",
			"default": true
		},
		"showAvatar": {
			"type": "boolean",
			"default": true
		}, 
		"avatarSize": {
			"type": "number",
			"default": 48
		},
		"showBio": {
			"type": "boolean",
			"default": true
		}
	}
}

Construire le bloc à rendre dans l’éditeur

Le sélecteur getEntityRecords est inclus dans le paquetage @wordpress/data. Pour l’utiliser, vous devez importer le hook useSelect de ce paquet dans votre fichier edit.js:

import { useSelect } from '@wordpress/data';

Ensuite, ajoutez le code suivant à la fonction Edit():

const posts = useSelect( ( select ) => {
	return select( 'core' ).getEntityRecords( 'postType', 'post', {
		'per_page': 3
	});
});

Dans le code ci-dessus, nous avons codé en dur le nombre d’articles. Mais vous voudrez peut-être donner aux utilisateurs la possibilité de définir un nombre différent d’articles. Vous pouvez utiliser un attribut pour cela.

Dans votre block.json, vous devriez avoir défini un attribut numberOfItems. Vous pouvez l’utiliser dans votre fonction Edit comme indiqué ci-dessous :

export default function Edit( { attributes } ) {

	const { numberOfItems } = attributes;

	const posts = useSelect( ( select ) => {
		return select( 'core' ).getEntityRecords( 'postType', 'post', {
			'per_page': numberOfItems
		});
	});

	console.log( posts );

	return (
		...
	);
}

Vous ne verrez pas encore les articles à l’écran, mais exécutez une console.log et voyez ce qui se passe dans la console de l’inspecteur de votre navigateur :

Le résultat dans la console du navigateur.
Le résultat dans la console du navigateur.

useSelect peut prendre deux arguments : un callback en ligne et un tableau de dépendances. Les deux renvoient une version mémorisée de la callback qui ne change que lorsqu’une des dépendances change.

Ainsi, pour récupérer à nouveau les articles à chaque modification de l’attribut numberOfItems, vous devez modifier la fonction Edit comme indiqué ci-dessous :

export default function Edit( { attributes } ) {

	const { numberOfItems } = attributes;

	const posts = useSelect(
		( select ) => {
			return select( 'core' ).getEntityRecords( 'postType', 'post', {
				'per_page': numberOfItems
			});
		}, 
		[ numberOfItems ]
	);

	console.log(posts);

	return (
		...
	);
}

Ensuite, vous devez rendre votre liste d’articles. Pour cela, vous pouvez utiliser la méthode JavaScript intégrée map:

export default function Edit( { attributes } ) {

	const { numberOfItems } = attributes;

	const posts = useSelect(
		( select ) => {
			return select( 'core' ).getEntityRecords( 'postType', 'post', {
				'per_page': numberOfItems
			});
		},
		[ numberOfItems ]
	);

	console.log(posts);
	
	return (
		<div { ...useBlockProps() }>
			<ul>
				{ posts && posts.map( ( post ) => {
					return (
						<li key={ post.id }>
							<h5>
								<a href={ post.link }>
									{ 
										post.title.rendered ? 
										post.title.rendered :
										__( 'Default title', 'author-plugin' )
									}
								</a>
							</h5>
						</li>
					)
				})}
			</ul>
		</div>
	);
}

Tout d’abord, elle vérifie si vous avez au moins un article dans le tableau, puis exécute la boucle.

Notez que, comme nous utilisons la méthode map avec un composant React, nous utilisons également un attribut key pour attribuer l’ID de l’article à l’élément de liste actuel.

post.link et post.title.rendered rendent respectivement l’URL et le titre de l’article.

L’image ci-dessous montre la liste complète des propriétés de l’objet post.

L'objet Post.
L’objet Post.

Le code ci-dessus n’est qu’un exemple de base de l’utilisation de getEntityRecords. Il est maintenant temps de mettre nos connaissances en pratique.

Disons que vous voulez empêcher votre bloc d’afficher les balises HTML que l’utilisateur a pu ajouter au titre de l’article. WordPress fournit un composantRawHTML pour cela.

Tout d’abord, vous allez importer le composant du paquetage @wordpress/element:

import { RawHTML } from '@wordpress/element';

Ensuite, vous allez envelopper le titre de l’article dans un élément RawHTML:

<div { ...useBlockProps() }>
	<ul>
		{ posts && posts.map((post) => {
			return (
				<li key={ post.id }>
					<h5>
						<a href={ post.link }>
							{ post.title.rendered ? (
								<RawHTML>
									{ post.title.rendered }
								</RawHTML>
							) : (
								__( 'Default title', 'author-plugin' )
							)}
						</a>
					</h5>
				</li>
			)
		})}
	</ul>
</div>

Et c’est tout. Maintenant, ajoutez une balise HTML au titre de votre article et enregistrez l’article. Testez ensuite votre code avec et sans RawHTML et voyez comment le contenu de votre bloc change à l’écran.

Ajouter la date

WordPress fournit un certain nombre de fonctions JavaScript pour gérer et formater les dates. Pour utiliser ces fonctions, vous devrez d’abord les importer du paquet@wordpress/date dans votre fichier edit.js:

import { dateI18n, format, __experimentalGetSettings } from '@wordpress/date';
  • dateI18n: Formate une date, en la traduisant dans la locale du site.
  • format: Formate une date.
  • __experimentalGetSettings: Affiche la date dans le format défini dans les réglages généraux de WordPress.

Ces fonctions ne sont pas documentées, mais vous trouverez des exemples utiles dans le code source de plusieurs blocs. Voir par exemple les fichiers latest-posts et post-date edit.js.

Ajoutez maintenant l’attribut displayDate:

const { numberOfItems, displayDate } = attributes;

Ajoutez ensuite le code suivant dans l’élément <li>:

{ 
	displayDate && (
		<time
			className='wp-block-author-box-author-plugin__post-date'
			dateTime={ format( 'c', post.date_gmt ) }
		>
			{ dateI18n(
				__experimentalGetSettings().formats.date, 
				post.date_gmt
			)}
		</time>
	) 
}

Que se passe-t-il ici ?

  • Si displayDate est true, alors affichez la date en utilisant un élémenttime .
  • L’attribut dateTime fournit l’heure et/ou la date de l’élément dans l’un des formats autorisés.
  • dateI18n récupère la date dans un format localisé. Cette fonction fonctionne de manière similaire à la fonction PHP date_i18n de WordPress.

Ajouter l’extrait

Il devrait maintenant être facile d’ajouter l’extrait de l’article. Tout d’abord, jetez un coup d’œil à la propriété excerpt dans l’inspecteur du navigateur. Vous verrez que le contenu réel est stocké dans excerpt.rendered.

Inspection de l'extrait de l'article dans Chrome DevTools.
Inspection de l’extrait de l’article dans Chrome DevTools.

Ensuite, ajoutez l’attribut displayExcerpt à l’objet attributes:

const { numberOfItems, displayDate, displayExcerpt } = attributes;

Puis ajoutez le code suivant avant la balise de fermeture </li> dans la fonction Edit:

{
	displayExcerpt &&
	post.excerpt.rendered && (
		<p>
			<RawHTML>
				{ post.excerpt.rendered }
			</RawHTML>
		</p>
	)
}

Si vous n’êtes pas familier avec JavaScript, ici et ci-dessus, nous avons utilisé l’évaluation en circuit court, par laquelle, si toutes les conditions sont vraies, alors la valeur du dernier opérande est renvoyée (pour en savoir plus, lisez Inline If avec l’opérateur logique && et l’opérateur logique AND (&&)).

Enfin, vous pouvez tester votre code à nouveau. Changez la valeur de l’attribut dans le fichier block.json et voyez ce qui se passe dans l’éditeur.

Ajouter l’image vedette

Vous devez maintenant ajouter le code qui rend les images vedettes. Commencez par ajouter l’attribut displayThumbnail à attributes:

const { 
	numberOfItems, 
	displayDate, 
	displayExcerpt, 
	displayThumbnail 
} = attributes;

Vous devez maintenant déterminer où est stockée l’image mise en avant. Comme nous l’avons mentionné ci-dessus, pour obtenir l’image mise en avant, vous devez ajouter un nouvel argument _embed à votre requête. De retour à votre code, changez les arguments de la requête comme suit :

const posts = useSelect(
	( select ) => {
		return select( 'core' ).getEntityRecords( 'postType', 'post', {
			'per_page': numberOfItems,
			'_embed': true
		});
	},
	[ numberOfItems ]
);

Ici, nous avons simplement ajouté '_embed': true au tableau des arguments. Cela donne un objet post contenant la propriété _embedded, qui fournit les détails de l’image dont vous avez besoin pour distribuer les images mises en avant.

Vous devriez maintenant savoir où trouver les détails de l’image.

Détails de l'image mise en avant dans la réponse getEntityRecords.
Détails de l’image mise en avant dans la réponse getEntityRecords.

Il vous suffit d’ajouter le code qui rend l’image à l’écran :

{
	displayThumbnail && 
	post._embedded && 
	post._embedded['wp:featuredmedia'] &&
	post._embedded['wp:featuredmedia'][0] &&
	<img 
	className='wp-block-author-box-author-plugin__post-thumbnail'
		src={ post._embedded['wp:featuredmedia'][0].media_details.sizes.medium.source_url }
		alt={ post._embedded['wp:featuredmedia'][0].alt_text }
	/>
}

Enregistrez le fichier, passez à l’éditeur de blocs, et vérifiez si l’image s’affiche correctement lorsque l’attribut displayThumbnail est défini sur true.

Une liste d'articles avec image mise en avant, date et extrait.
Une liste d’articles avec image mise en avant, date et extrait.

Ajouter des contrôles de colonne latérale

Jusqu’à présent, nous avons utilisé les valeurs par défaut des attributs définies dans le block.json. Mais grâce à notre article précédent, nous savons que nous pouvons définir des gestionnaires d’événements pour donner aux utilisateurs la possibilité d’attribuer des valeurs personnalisées à chaque attribut.

Pour ce faire, vous allez ajouter un ensemble de contrôles à la colonne latérale des réglages du bloc. Dans edit.js, importez les composants suivants depuis les paquets correspondants :

import { 
	useBlockProps,
	InspectorControls
} from '@wordpress/block-editor';

import {
	PanelBody,
	PanelRow,
	QueryControls,
	ToggleControl,
	RangeControl
} from '@wordpress/components';
  • InspectorControls: Contient les réglages de la colonne latérale qui affectent l’ensemble du bloc (voir sur GitHub)
  • PanelBody: Ajoute un conteneur pliable à la colonne latérale des réglages (voir sur GitHub)
  • PanelRow: Produit un conteneur générique pour les contrôles de la colonne latérale (voir sur GitHub)
  • QueryControls: Fournit des contrôles de réglages pour construire une requête (voir sur GitHub)
  • ToggleControl: Fournit un bouton à bascule pour que les utilisateurs puissent activer/désactiver une option spécifique (voir sur GitHub)
  • RangeControl: Est utilisé pour effectuer des sélections dans une gamme de valeurs incrémentielles (voir sur GitHub)

Ensuite, vous devez mettre à jour la fonction Edit pour utiliser les contrôles désormais disponibles. Tout d’abord, modifiez la fonction Edit comme suit :

export default function Edit( { attributes, setAttributes } ) {

	const { 
		numberOfItems, 
		columns, 
		displayExcerpt, 
		displayDate, 
		displayThumbnail
	} = attributes;

	const posts = useSelect(
		( select ) => {
			return select( 'core' ).getEntityRecords( 'postType', 'post', {
				'per_page': numberOfItems,
				'_embed': true
			});
		},
		[ numberOfItems ]
	);
	...
}

Notez la propriété setAttributes transmise à la fonction Edit.

Vous pouvez maintenant ajouter les éléments correspondants à votre code JSX :

return (
	<>
		<InspectorControls>
			<PanelBody title={ __( 'Content Settings', 'author-plugin' ) }>
				<PanelRow>
					<QueryControls 
						numberOfItems={ numberOfItems }
						onNumberOfItemsChange={ ( value ) =>
							setAttributes( { numberOfItems: value } )
						}
						minItems={ 1 }
						maxItems={ 10 }
					/>
				</PanelRow>
				<PanelRow>
					<RangeControl
						label={ __( 'Number of Columns', 'author-plugin' ) }
						value={ columns }
						onChange={ ( value ) =>
							setAttributes( { columns: value } )
						}
						min={ 1 }
						max={ 4 }
						required
					/>
				</PanelRow>
				<PanelRow>
					<ToggleControl
						label={ __( 'Show Featured Image', 'author-plugin' ) }
						checked={ displayThumbnail }
						onChange={ () =>
							setAttributes( { displayThumbnail: ! displayThumbnail } )
						}
					/>
				</PanelRow>
				<PanelRow>
					<ToggleControl
						label={ __( 'Show Date', 'author-plugin' ) }
						checked={ displayDate }
						onChange={ () =>
							setAttributes( { displayDate: ! displayDate } )
						}
					/>
				</PanelRow>
				<PanelRow>
					<ToggleControl
						label={ __( 'Display Excerpt', 'author-plugin' ) }
						checked={ displayExcerpt }
						onChange={ () =>
							setAttributes( { displayExcerpt: ! displayExcerpt } )
						}
					/>
				</PanelRow>
			</PanelBody>
		</InspectorControls>
		<div { ...useBlockProps() }>
			...
		</div>
	</>
);

C’est beaucoup de code, n’est-ce pas ? Mais c’est assez facile à comprendre.

Les attributs d’élément qui méritent le plus votre attention ici sont onNumberOfItemsChange dans QueryControls et onChange dans RangeControl et ToggleControl. Ces attributs définissent les gestionnaires d’événements nécessaires pour permettre à l’utilisateur de personnaliser l’apparence et/ou le comportement d’un bloc.

Vous remarquerez également que nous avons utilisé les balises <> et </>, qui sont la syntaxe courte pour déclarer les fragments React.

Maintenant, enregistrez votre fichier, passez dans l’éditeur et rafraîchissez la page :

Réglages du bloc.
Réglages du bloc.

Tout est là ? Alors passons à autre chose et ajoutons les détails de l’auteur du post.

Trouver l’auteur de l’article

Comme nous l’avons mentionné ci-dessus, notre bloc affichera une liste d’articles écrits par le même auteur que l’article actuel.

Pour obtenir l’ID de l’auteur de l’article, vous allez importer le sélecteurgetCurrentPostAttribute depuis le stockage de données core/editor:

wp.data.select( 'core/editor' ).getCurrentPostAttribute( 'author' )

getCurrentPostAttribute renvoie une valeur d’attribut pour l’article enregistré.

Une fois que vous avez obtenu l’ID de l’auteur, vous pouvez modifier la requête comme indiqué ci-dessous :

const posts = useSelect(
	( select ) => {

		const _authorId = select( 'core/editor' ).getCurrentPostAttribute( 'author' );
	
		return select( 'core' ).getEntityRecords( 'postType', 'post', {
			'author': _authorId,
			'per_page': numberOfItems,
			'_embed': true
		});
	},
	[ numberOfItems ]
);

Avec ce code, vous obtiendrez une liste des articles n du même auteur que l’article actuel.

Maintenant que vous avez l’ID de l’auteur, vous pouvez également l’utiliser pour récupérer des données supplémentaires dans la base de données.

Afficher les détails de l’auteur

Comme nous ne disposons d’aucune documentation, nous avons utilisé le code du bloc du cœur Auteur de l’article comme référence.

Pour afficher les détails de l’auteur, vous devez d’abord importer une nouvelle dépendance :

import { forEach } from 'lodash';

Ensuite, dans la fonction Edit, mettez à jour l’objet attributes comme suit :

const { 
	numberOfItems, 
	columns, 
	displayExcerpt, 
	displayDate, 
	displayThumbnail, 
	displayAuthorInfo, 
	showAvatar, 
	avatarSize, 
	showBio 
} = attributes;

Une fois cela fait, vous modifierez le code vu dans la section précédente pour récupérer les détails de l’auteur :

const { authorDetails, posts } = useSelect(
	( select ) => {

		const _authorId = select( 'core/editor' ).getCurrentPostAttribute( 'author' );

		const authorDetails = _authorId ? select( 'core' ).getUser( _authorId ) : null;
	
		const posts = select( 'core' ).getEntityRecords( 'postType', 'post', {
			'author': _authorId,
			'per_page': numberOfItems,
			'_embed': true
		});

		return { 
			authorDetails: authorDetails,
			posts: posts
		};
	},
	[ numberOfItems ]
);

Notez que nous avons utilisé le sélecteurgetUser pour obtenir les détails de l’auteur.

Ensuite, vous voudrez peut-être obtenir l’avatar de l’auteur. Le code ci-dessous construit un tableau d’éléments stockant les URL et les tailles des avatars :

const avatarSizes = [];
if ( authorDetails ) {
	forEach( authorDetails.avatar_urls, ( url, size ) => {
		avatarSizes.push( {
			value: size,
			label: `${ size } x ${ size }`,
		} );
	} );
}

Ensuite, vous ajouterez les panneaux et les contrôles de la barre latérale pour permettre aux utilisateurs de personnaliser la zone de l’auteur dans le bloc :

return (
	<>
		<InspectorControls>
			<PanelBody title={ __( 'Author Info', 'author-plugin' ) }>
				<PanelRow>
					<ToggleControl
						label={ __( 'Display Author Info', 'author-plugin' ) }
						checked={ displayAuthorInfo }
						onChange={ () =>
							setAttributes( { displayAuthorInfo: ! displayAuthorInfo } )
						}
					/>
				</PanelRow>
				{ displayAuthorInfo && (
					<>
						<PanelRow>
							<ToggleControl
								label={ __( 'Show avatar' ) }
								checked={ showAvatar }
								onChange={ () =>
									setAttributes( { showAvatar: ! showAvatar } )
								}
							/>
							{ showAvatar && (
								<SelectControl
									label={ __( 'Avatar size' ) }
									value={ avatarSize }
									options={ avatarSizes }
									onChange={ ( size ) => {
										setAttributes( {
											avatarSize: Number( size ),
										} );
									} }
								/>
							) }
						</PanelRow>
						<PanelRow>
							<ToggleControl
								label={ __( 'Show Bio', 'author-plugin' ) }
								checked={ showBio }
								onChange={ () =>
									setAttributes( { showBio: ! showBio } )
								}
							/>
						</PanelRow>
					</>
				) }
			</PanelBody>
			...
		</InspectorControls>
		...
	</>
);

L’image ci-dessous montre la colonne latérale de réglages mise à jour :

The Author Info settings panel.
Le panneau de paramètres Info Auteur.

Enfin, vous pouvez ajouter la section de l’auteur à votre bloc :

return (
	<>
		<InspectorControls>
		...
		</InspectorControls>

		<div { ...useBlockProps() }>
			{ displayAuthorInfo  && authorDetails && (
				<div className="wp-block-author-box-author-plugin__author">
					{ showAvatar && (
						<div className="wp-block-author-box-author-plugin__avatar">
							<img
								width={ avatarSize }
								src={
									authorDetails.avatar_urls[
										avatarSize
									]
								}
								alt={ authorDetails.name }
							/>
						</div>
					) }
					<div className='wp-block-author-box-author-plugin__author-content'>
						<p className='wp-block-author-box-author-plugin__name'>
							{ authorDetails.name }
						</p>
						{ showBio &&
							// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
							authorDetails?.description &&
							authorDetails.description.length > 0 && (
							<p className='wp-block-author-box-author-plugin__description'>{ authorDetails.description }</p>
						) }
					</div>
				</div>
			)}
			<ul>
			...
			</ul>
		</div>
	</>
);

L’image suivante montre le rendu à l’écran.

Section des détails de l'auteur et réglages d'information.
Section des détails de l’auteur et réglages d’information.

Enregistrez maintenant votre fichier edit.js et exécutez vos tests. Votre bloc devrait inclure différents éléments en fonction des réglages du bloc.

Les détails de l'auteur ne montrent pas la bio de l'auteur.
Les détails de l’auteur ne montrent pas la bio de l’auteur.

Il manque encore une dernière chose : le nombre de colonnes pour afficher les articles.

Modifiez le nombre de colonnes

Pour donner à l’utilisateur la possibilité d’afficher les aperçus d’articles en colonnes, nous avons défini l’attribut columns dans le fichier block.json. Nous avons également inclus un attribut columns dans le script et créé un contrôle des réglages pour permettre aux utilisateurs de modifier le nombre de colonnes, bien que ce changement n’ait aucun effet pour le moment.

Dans le code JSX ci-dessus, vous devriez avoir remarqué que nous avons ajouté des classes CSS à plusieurs éléments :

Classes attribuées aux éléments de la section Auteur :

  • wp-block-author-box-author-plugin__author
  • wp-block-author-box-author-plugin__avatar
  • wp-block-author-box-author-plugin__author-content
  • wp-block-author-box-author-plugin__name
  • wp-block-author-box-author-plugin__description

Classes attribuées aux éléments de la section du contenu :

  • wp-block-author-box-author-plugin__post-items
  • wp-block-author-box-author-plugin__post-thumbnail
  • wp-block-author-box-author-plugin__post-title
  • wp-block-author-box-author-plugin__post-date
  • wp-block-author-box-author-plugin__post-excerpt

Une classe est encore manquante. Le nom de cette classe sera généré dynamiquement pour refléter le nombre de colonnes défini par l’utilisateur.

Retournez au fichier Edit.js et modifiez l’élément ul comme suit :

<ul className={ `wp-block-author-box-author-plugin__post-items columns-${ columns }` }>
	...
</ul>

Nous avons ajouté une nouvelle classe columns-${ columns } selon la syntaxe Template literals pour insérer une expression à l’intérieur d’une chaîne de caractères. De cette façon, l’attribut attaché à l’élément ul dépendra des réglages de l’utilisateur (par exemple, columns-1, columns-2, etc.).

Ouvrez maintenant le fichier style.scss et remplacez le code existant par le suivant :

.wp-block-author-box-author-plugin {
	background-color: #21759b;
	color: #fff;
	padding: .6em;
	ul.wp-block-author-box-author-plugin__post-items {
		padding: 0;
		list-style-type: none;
		display: grid;
		gap: .5em;
		@for $i from 2 through 4 {
			&.columns-#{ $i } {
				grid-template-columns: repeat(#{ $i }, 1fr);
			}
		}
		li {
			list-style: none;
			img.wp-block-author-box-author-plugin__post-thumbnail {
				height: auto;
				max-width: 100%;
			}
		}
		
	}
}
.wp-block-author-box-author-plugin__author {
	display: flex;
    flex-wrap: wrap;
}

.wp-block-author-box-author-plugin__avatar {
	margin-right: 1em;
}

.wp-block-author-box-author-plugin__author-content {
	flex-basis: 0;
    flex-grow: 1;
}

Nous n’irons pas en profondeur dans ce code, étant au-delà de la portée de cet article. Mais si vous souhaitez plonger plus profondément, vous pouvez vous référer aux ressources suivantes :

Le bloc Auteur dans l'éditeur.
Le bloc Auteur dans l’éditeur.

Et c’est tout pour le rendu du bloc dans l’éditeur.

Construire le bloc pour le rendre sur la page

Maintenant que le code qui assure le rendu du bloc dans l’éditeur est complet, nous pouvons passer à la construction du bloc pour le rendu sur l’interface publique.

Comme nous l’avons mentionné précédemment, lorsqu’il s’agit de blocs dynamiques, le fichier de l’extension est responsable de la génération du HTML à rendre sur l’interface publique.

Ouvrez donc le fichier principal de votre extension(author-plugin.php dans notre exemple).

La première chose à faire est de mettre les attributs du bloc à la disposition de la fonction PHP de WordPress. Dans votre fichier PHP, modifiez la définition de la fonction comme suit :

function author_box_author_plugin_render_author_content( $attr ) {
	...
}

Vous pouvez maintenant utiliser les fonctions WordPress pour récupérer et manipuler des données. Par exemple, vous pouvez utiliser get_posts pour récupérer les derniers articles du blog (pour en savoir plus, lisez notre article détaillé sur la fonctionget_posts ) :

function author_box_author_plugin_render_author_content( $attr ) {
	$args = array(
		'numberposts'	=> $attr['numberOfItems'],
	);
	$my_posts = get_posts( $args );
	
	if( ! empty( $my_posts ) ){
		$output = '<ul>';
		foreach ( $my_posts as $p ){
			$output .= '<li><a href="' . esc_url( get_permalink( $p->ID ) ) . '">' 
			. $p->post_title . '</a></li>';
		}
		$output .= '</ul>';
	}
	return $output ?? '<strong>Sorry. No posts matching your criteria!</strong>';
}

La fonction ci-dessus récupère les derniers articles de blog numberOfItems de votre base de données WordPress (par défaut, post_type est défini sur post) et renvoie un tableau d’objets $post. Ensuite, elle itère sur le tableau pour construire les éléments de la liste.

Si vous inspectez la sortie HTML, vous remarquerez qu’il s’agit d’une simple liste d’articles, comme celle présentée dans l’image suivante :

Une simple liste d'articles.
Une simple liste d’articles.

Dans notre article précédent, nous avons mentionné que vous utiliserez le hook React useBlockProps pour marquer l’élément wrapper du bloc dans votre code JSX. Vous devrez faire de même dans votre fonction PHP.

WordPress fournit la fonctionget_block_wrapper_attributes pour cela.

Donc, modifiez votre code PHP comme suit :

function author_box_author_plugin_render_author_content( $attr ) {
	$args = array(
		'numberposts'	=> $attr['numberOfItems']
	);
	$my_posts = get_posts( $args );
	
	if( ! empty( $my_posts ) ){
		$output = '<div ' . get_block_wrapper_attributes() . '>';
		$output .= '<ul>';
		foreach ( $my_posts as $p ){
			
			$title = $p->post_title ? $p->post_title : 'Default title';
			$url = esc_url( get_permalink( $p->ID ) );

			$output .= '<li>';
			$output .= '<a href="' . $url . '">' . $title . '</a>';
			$output .= '</li>';
		}
		$output .= '</ul>';
		$output .= '</div>';
	}
	return $output ?? '<strong>Sorry. No posts matching your criteria!</strong>';
}

Maintenant, une classewp-block-author-box-author-plugin a été attribuée à l’élément conteneur et le bloc a une couleur d’arrière-plan différente.

Ensuite, la fonction get_posts obtient les données WP_Posts et le cycle foreach construit les éléments de la liste (voir aussi Comment afficher les données retournées par get_posts).

Une liste d'articles avec une classe CSS attribuée.
Une liste d’articles avec une classe CSS attribuée.

Ajouter l’image mise en avant, la date et l’extrait

Ensuite, vous devrez ajouter les images mises en avant, les dates et les extraits des messages. Dans le même fichier, modifiez votre code PHP comme suit :

function author_box_author_plugin_render_author_content( $attr ) {
	$args = array(
		'numberposts'	=> $attr['numberOfItems']
	);
	$my_posts = get_posts( $args );
	
	if( ! empty( $my_posts ) ){
		$output = '<div ' . get_block_wrapper_attributes() . '>';
		$output .= '<ul class="wp-block-author-box-author-plugin__post-items columns-">';

		foreach ( $my_posts as $p ){
			
			$title = $p->post_title ? $p->post_title : 'Default title';
			$url = esc_url( get_permalink( $p->ID ) );
			$thumbnail = has_post_thumbnail( $p->ID ) ? get_the_post_thumbnail( $p->ID, 'medium' ) : '';

			$output .= '<li>';
			if( ! empty( $thumbnail ) && $attr['displayThumbnail'] ){
				$output .= $thumbnail;
			}
			$output .= '<h5><a href="' . $url . '">' . $title . '</a></h5>';
			if( $attr['displayDate'] ){
				$output .= '<time datetime="' . esc_attr( get_the_date( 'c', $p ) ) . '">' . esc_html( get_the_date( '', $p ) ) . '</time>';
			}
			if( get_the_excerpt( $p ) && $attr['displayExcerpt'] ){
				$output .= '<p>' . get_the_excerpt( $p ) . '</p>';
			}
			$output .= '</li>';
		}
		$output .= '</ul>';
		$output .= '</div>';
	}
	return $output ?? '<strong>Sorry. No posts matching your criteria!</strong>';
}

La boucle foreach itère sur le tableau $my_posts. À chaque itération, plusieurs conditions vérifient les valeurs des attributs et construisent la sortie en conséquence.

Regardez maintenant la sortie à l’écran :

Une liste d'articles avec des images mises en avant, des dates et des extraits.
Une liste d’articles avec des images mises en avant, des dates et des extraits.

Vous pouvez maintenant exécuter vos tests. Modifiez les réglages de date, d’extrait et de miniature et vérifiez comment le contenu du bloc change sur l’interface publique.

Afficher les articles en colonnes

Dans notre code JavaScript, nous avons utilisé une classe columns-${ columns } pour afficher les aperçus des articles en colonnes. Nous devons maintenant faire la même chose en PHP.

Pour ce faire, il suffit d’ajouter ces deux lignes de code :

$num_cols = $attr['columns'] > 1 ? strval( $attr['columns'] ) : '1';

$output .= '<ul class="wp-block-author-box-author-plugin__post-items columns-' . $num_cols . '">';

Cela ajoutera une classe columns-n à l’élément ul contenant les aperçus des articles. Maintenant, le nombre de colonnes affichées sur la page devrait correspondre au nombre de colonnes défini dans les réglages du bloc.

Construire la boîte de l’auteur

Enfin, vous devez créer la boîte contenant les détails de l’auteur, notamment son avatar, son nom et sa description.

Dans la fonction de rappel, vous devrez ajouter un ensemble de conditions pour vérifier la valeur actuelle de chaque attribut :

if( $attr['displayAuthorInfo'] ){
	$output .= '<div class="wp-block-author-box-author-plugin__author">';
	
	if( $attr['showAvatar'] ){
		$output .= '<div class="wp-block-author-box-author-plugin__avatar">' 
			. get_avatar( get_the_author_meta( 'ID' ), $attr['avatarSize'] ) 
			. '</div>';
	}

	$output .= '<div class="wp-block-author-box-author-plugin__author-content">';
	
	$output .= '<div class="wp-block-author-box-author-plugin__name">' 
		. get_the_author_meta( 'display_name' ) 
		. '</div>';

	if( $attr['showBio'] ){
		$output .= '<div class="wp-block-author-box-author-plugin__description">' 
			. get_the_author_meta( 'description' ) 
			. '</div>';
	}

	$output .= '</div>';
	$output .= '</div>';
}

Le code est assez simple. Il vérifie la valeur actuelle de chaque attribut, et s’il s’agit de true, il génère le HTML nécessaire.

Maintenant, enregistrez votre fichier PHP et comparez le bloc dans l’éditeur par rapport au même bloc sur l’interface publique.

Notre bloc personnalisé dans l'éditeur de bloc.
Notre bloc personnalisé dans l’éditeur de bloc.

Vous trouverez le code complet du bloc d’exemple dans ce Gist public.

Ressources recommandées pour le développement de blocs dynamiques

Si vous avez dressé l’oreille en lisant cet article et commencé à reconnaître les opportunités de développement professionnel qui découlent de l’apprentissage de la création de blocs Gutenberg, eh bien, notre conseil est de continuer à explorer et à acquérir de nouvelles compétences dans les technologies derrière le développement de blocs.

Bien qu’une documentation officielle fiable fasse toujours défaut, il existe néanmoins d’excellentes ressources, gratuites ou payantes, que nous avons consultées lors de la rédaction de cet article. Parmi les nombreuses ressources disponibles, nous vous recommandons les suivantes :

Ressources officielles

Tutoriels recommandés par les contributeurs du cœur de WordPress

Ressources JavaScript, React et Redux

Ressources similaires Kinsta

Résumé

Nous sommes arrivés à la fin de ce (deuxième) long voyage dans le développement des blocs Gutenberg.

Dans cet article, nous avons abordé quelques sujets avancés, comme l’Application State et les stockages Redux. Mais avec un peu de chance, vous devriez maintenant avoir une meilleure compréhension du développement de blocs en général.

Oui, des compétences en Node.js, Webpack, Babel, React et Redux sont essentielles lorsqu’il s’agit de construire des blocs Gutenberg avancés, mais vous n’avez pas besoin d’être un ninja de React pour vous lancer. Apprendre à développer des blocs Gutenberg n’est pas forcément compliqué. Il suffit de le faire avec la bonne motivation et en suivant le parcours d’apprentissage approprié.

Et nous espérons que cet article – et le précédent – vous fourniront la bonne carte pour trouver votre chemin et vous lancer dans le développement de Gutenberg dès maintenant.

À vous de jouer maintenant ! Avez-vous déjà créé des blocs dynamiques ? Avez-vous des exemples à partager avec nous ? Et quels ont été les plus grands obstacles dans votre expérience ? N’hésitez pas à laisser un commentaire ci-dessous.

Carlo Daniele Kinsta

Carlo is a passionate lover of webdesign and front-end development. He has been playing with WordPress for more than 20 years, also in collaboration with Italian and European universities and educational institutions. He has written hundreds of articles and guides about WordPress, published both on Italian and international websites, as well as on printed magazines. You can find him on LinkedIn.