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

Blocs Gutenberg

allowed_block_types_all adapte l’inserteur selon le type de contenu édité

Douze blocs pour une page classique, trois seulement pour une fiche produit. Ce filtre PHP restreint l'inserteur selon le type de contenu ouvert, sans toucher au JavaScript.

Par WordPress Développement • 14 janvier 2022 • 4 min de lecture • Aucun commentaire
allowed_block_types_all adapte l'inserteur selon le type de contenu édité

Douze blocs pertinents pour une page de contenu éditorial classique : titres, paragraphes, images, citations, listes. Trois blocs seulement pour une fiche produit dont la structure doit rester stable : un titre, une galerie d’images, un bloc de caractéristiques techniques maison. Proposer les douze mêmes blocs sur les deux types de contenu ne fait qu’encombrer l’inserteur et multiplier les risques d’erreur pour un rédacteur qui découvre un type de contenu qu’il maîtrise moins bien.

Ce tutoriel détaille comment utiliser le filtre allowed_block_types_all pour adapter précisément la liste des blocs disponibles selon le type de contenu ouvert dans l’éditeur, étape par étape.

Étape 1 : comprendre la signature du filtre

Le filtre reçoit deux arguments : la valeur actuellement autorisée (par défaut true, signifiant que tous les blocs enregistrés sont autorisés), et une instance de WP_Block_Editor_Context qui donne accès, entre autres, à l’article en cours d’édition via sa propriété post :

add_filter( 'allowed_block_types_all', function( $allowed_blocks, $context ) {
    // $allowed_blocks vaut true par défaut
    // $context->post donne accès à l'article en cours, si applicable
    return $allowed_blocks;
}, 10, 2 );

Étape 2 : retourner un tableau de blocs pour un type de contenu précis

L'essentiel à retenir : Reçoit le contexte d'édition en second argument, avec le post associé ; Accepte un tableau de noms de blocs ou un simple booléen ; S'applique côté serveur, avant même le chargement du JavaScript de l'éditeur

Pour restreindre l’inserteur uniquement sur le type de contenu fiche-produit, on teste la propriété post_type du post associé au contexte, puis on retourne un tableau explicite des noms de blocs autorisés :

add_filter( 'allowed_block_types_all', function( $allowed_blocks, $context ) {
    if ( ! $context->post || 'fiche-produit' !== $context->post->post_type ) {
        return $allowed_blocks;
    }

    return [
        'core/heading',
        'core/gallery',
        'mon-extension/caracteristiques-techniques',
    ];
}, 10, 2 );

Sur tout autre type de contenu, la fonction retourne $allowed_blocks inchangé, ce qui laisse l’inserteur complet disponible ailleurs sur le site.

Étape 3 : vérifier le résultat dans l’éditeur

Une fois le filtre en place, ouvrir une fiche produit existante et cliquer sur l’inserteur de blocs (le bouton représentant un signe plus) doit afficher uniquement les trois blocs autorisés, tous les autres disparaissant de la recherche comme de la liste par catégorie. Ce comportement s’applique dès le chargement de l’éditeur, avant toute interaction du rédacteur : il ne s’agit pas d’un simple masquage visuel côté JavaScript, mais d’une restriction appliquée en amont, côté serveur.

Étape 4 : combiner avec un test sur les capacités de l’utilisateur

Le filtre se combine naturellement avec current_user_can() pour distinguer un profil administrateur, qui garde accès à tous les blocs y compris sur une fiche produit, d’un profil rédacteur plus contraint :

add_filter( 'allowed_block_types_all', function( $allowed_blocks, $context ) {
    if ( current_user_can( 'manage_options' ) ) {
        return $allowed_blocks; // pas de restriction pour les administrateurs
    }

    if ( $context->post && 'fiche-produit' === $context->post->post_type ) {
        return [ 'core/heading', 'core/gallery', 'mon-extension/caracteristiques-techniques' ];
    }

    return $allowed_blocks;
}, 10, 2 );

Étape 5 : vérifier le comportement dans l’éditeur de site

Ce filtre s’applique aussi dans l’éditeur de site (FSE), où $context->post reste vide en l’absence d’article associé. Il est donc essentiel de tester ce cas explicitement, sous peine de restreindre par erreur l’inserteur lors de l’édition d’un gabarit, ce qui bloquerait des blocs pourtant nécessaires à la construction du thème.

if ( ! $context->post ) {
    return $allowed_blocks; // ne rien restreindre dans l'éditeur de site
}

Points de vigilance

  • Retourner un tableau vide bloque totalement l’insertion de tout bloc, y compris ceux déjà présents dans le contenu existant : à réserver aux cas où c’est réellement voulu.
  • Ce filtre remplace l’ancien allowed_block_types, déprécié depuis WordPress 5.8 au profit du contexte d’édition complet.
  • Un bloc déjà inséré dans le contenu avant l’application du filtre reste affiché normalement : la restriction ne s’applique qu’à l’inserteur, pas au contenu existant.

Sur nos sites à types de contenu multiples, ce filtre fait partie des premiers réglages posés, avant même la personnalisation visuelle des blocs : une liste de blocs adaptée réduit immédiatement les erreurs de saisie des rédacteurs.

En résumé

allowed_block_types_all transforme un inserteur générique en outil réellement adapté à chaque type de contenu, avec un contrôle fin par rôle si besoin. La clé reste de toujours tester le cas où $context->post est vide, pour ne pas casser accidentellement l’édition des gabarits du site.

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