Le WordPress d'aujourd'hui, décodé pour les développeurs

Blocs Gutenberg

Le filtre block_type_metadata modifie un block.json à la volée sans le réécrire

Impossible de modifier le fichier block.json d'une extension tierce sans la forker ? Le filtre block_type_metadata intercepte ces métadonnées avant leur enregistrement.

Par WordPress Développement • 3 août 2023 • 4 min de lecture • Aucun commentaire
Le filtre block_type_metadata modifie un block.json à la volée sans le réécrire

« Les métadonnées de bloc, telles que déclarées dans block.json, peuvent être filtrées avant leur enregistrement via le hook block_type_metadata. » Cette phrase, formulée ainsi dans la documentation du Bloc Editor Handbook, résume exactement le problème que ce filtre résout : adapter le comportement déclaratif d’un bloc, y compris un bloc fourni par une extension tierce, sans toucher à son code source.

Le cas typique : une extension tierce enregistre un bloc utile, mais avec des réglages trop larges (un support d’alignement full non désiré, une catégorie mal choisie, une icône générique) qu’il n’est pas question de corriger en modifiant les fichiers du plugin, puisque la moindre mise à jour effacerait la correction.

Le problème concret

Un bloc d’affichage de témoignages, fourni par une extension de formulaires, s’enregistre avec "align": ["wide", "full"] dans son block.json. Sur un projet où la charte graphique interdit toute image en pleine largeur hors de la zone de contenu principale, ce réglage crée régulièrement des mises en page cassées lorsque des rédacteurs l’utilisent sans le savoir. Forker l’extension pour retirer une ligne de configuration serait disproportionné et fragiliserait la maintenance à chaque mise à jour du plugin d’origine.

Le filtre, en pratique

Le filtre block_type_metadata reçoit le tableau de métadonnées tel qu’il vient d’être lu depuis block.json, juste avant que register_block_type() ne l’utilise pour enregistrer le bloc. Il suffit de repérer le bloc visé par son nom et d’ajuster le tableau :

add_filter( 'block_type_metadata', function ( $metadata ) {
	if ( ( $metadata['name'] ?? '' ) !== 'formulaires-pro/temoignages' ) {
		return $metadata;
	}

	// On retire les alignements larges non souhaités sur ce projet.
	if ( isset( $metadata['supports']['align'] ) ) {
		$metadata['supports']['align'] = false;
	}

	// On recatégorise le bloc pour qu'il apparaisse avec les autres
	// blocs de contenu éditorial plutôt que dans « Formulaires ».
	$metadata['category'] = 'text';

	return $metadata;
} );
L'essentiel à retenir : Intercepte les métadonnées avant register_block_type ; Fonctionne sur les blocs tiers comme sur les siens ; Ne modifie jamais le fichier source sur le disque

Où placer ce code

Ce filtre doit s’exécuter avant l’enregistrement effectif du bloc concerné, ce qui signifie généralement un accrochage sur init avec une priorité égale ou antérieure à celle utilisée par l’extension cible pour enregistrer ses blocs. En cas de doute sur l’ordre d’exécution, une priorité basse (comme 5) sur le hook init garantit que le filtre est bien en place avant la plupart des enregistrements de blocs standards.

  • Placer l’ajout du filtre dans un plugin propre au projet plutôt que dans le thème, pour qu’il survive à un changement de thème.
  • Toujours vérifier le nom exact du bloc via $metadata['name'] avant toute modification, pour ne jamais affecter d’autres blocs par erreur.
  • Retourner systématiquement le tableau, même inchangé, dans la branche par défaut : oublier ce retour casse l’enregistrement de tous les autres blocs du site.

Variantes utiles de ce filtre

Ajouter un attribut supplémentaire à un bloc existant

add_filter( 'block_type_metadata', function ( $metadata ) {
	if ( ( $metadata['name'] ?? '' ) === 'formulaires-pro/temoignages' ) {
		$metadata['attributes']['noteMoyenne'] = array(
			'type'    => 'number',
			'default' => 0,
		);
	}

	return $metadata;
} );

Désactiver un rendu côté serveur pour le remplacer par un autre

Il est également possible de retirer la clé render (ou renderCallback côté PHP après enregistrement, via un filtre distinct sur les block types déjà enregistrés) pour rediriger le rendu vers une fonction propre au projet, à condition de reproduire fidèlement les attributs attendus par le balisage existant.

Ce que ce filtre ne permet pas

Le filtre agit sur les métadonnées déclaratives, pas sur le rendu PHP effectif du bloc ni sur son comportement en JavaScript dans l’éditeur. Modifier la logique de render_callback d’un bloc tiers demande un mécanisme différent, généralement le filtre render_block_data ou render_block, selon que l’on souhaite intervenir avant ou après le calcul du rendu.

En résumé

block_type_metadata offre un point d’ajustement précis et non intrusif pour corriger la déclaration d’un bloc, qu’il vienne d’une extension tierce ou de son propre projet, sans jamais modifier de fichier source. Bien ciblé par nom de bloc et bien priorisé sur init, ce filtre évite le fork complet d’une extension pour un réglage qui, souvent, tient en deux lignes.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi