vendredi 25 septembre 2026

À propos

Contact

FSE

query_loop_block_query_vars : injecter vos filtres dans une boucle

Le futur bloc de boucle du plugin Gutenberg expose déjà un filtre pour modifier sa requête. Comment s'en servir sans casser le prototype à chaque mise à jour.

Par Clément Hadrot • 9 juin 2020 • 4 min de lecture • Aucun commentaire
query_loop_block_query_vars : injecter vos filtres dans une boucle

Le prototype de boucle de requête qui circule dans les versions récentes du plugin Gutenberg n’a pas encore de nom stabilisé — on l’appelle parfois « Query », parfois « Post Template » selon les changelogs. Mais il expose déjà un point d’extension précieux pour qui veut aller plus loin que les réglages visibles dans l’inspecteur de blocs.

Ce point d’extension s’appelle query_loop_block_query_vars. Comme souvent chez WordPress, un filtre PHP classique permet de modifier un comportement avant qu’il ne s’exécute, ici juste avant la construction de la requête WP_Query qui alimente le bloc.

Ce que fait exactement ce filtre

Quand le bloc s’apprête à afficher sa liste d’articles, le code de rendu construit un tableau d’arguments (post type, nombre d’éléments, ordre, taxonomie éventuellement choisie dans l’inspecteur) puis passe ce tableau dans le filtre avant de l’envoyer à WP_Query. Concrètement, cela ressemble à ceci dans une fonction ajoutée à un plugin maison :

add_filter( 'query_loop_block_query_vars', function( $query, $block ) {
    // On force l'exclusion d'une catégorie « brouillon interne »
    $query['category__not_in'] = array( 42 );

    // On ne garde que les articles publiés il y a plus d'une semaine
    $query['date_query'] = array(
        array( 'before' => '-7 days' ),
    );

    return $query;
}, 10, 2 );

Le second paramètre, $block, correspond à l’instance du bloc en cours de rendu. On peut y lire ses attributs pour ne cibler qu’un bloc précis, par exemple si un attribut personnalisé a été ajouté via une extension côté client de l’éditeur.

Un usage concret : exclure le contenu épinglé du flux principal

Sur un projet de blog éditorial, le besoin était simple : un article « à la une » choisi manuellement par la rédaction ne devait jamais réapparaître dans la boucle du dessous, pour éviter la redondance visuelle. Plutôt que de dupliquer une logique de requête PHP classique, ce filtre a permis de patcher directement la boucle expérimentale sans toucher au thème.

L'essentiel à retenir : Filtre appliqué juste avant WP_Query ; Fonctionne sur les arguments, pas le rendu ; API encore mouvante, à isoler dans un plugin
add_filter( 'query_loop_block_query_vars', function( $query ) {
    $a_la_une = get_option( 'article_a_la_une_id' );

    if ( $a_la_une ) {
        $query['post__not_in'] = array( (int) $a_la_une );
    }

    return $query;
}, 10, 1 );

Cette approche a un avantage net : elle reste centralisée dans un fichier de plugin, versionnée avec le reste du projet, plutôt que perdue dans un attribut de bloc difficile à retrouver six mois plus tard.

Les limites à connaître avant de s’y fier

  • Le nom du filtre, comme le comportement du bloc lui-même, n’est pas garanti stable : cette boucle est encore un prototype du plugin Gutenberg, pas une fonctionnalité de WordPress cœur.
  • Le filtre agit sur les arguments de requête, jamais sur le rendu final : impossible d’insérer un bloc supplémentaire entre deux articles via ce mécanisme.
  • Aucune vérification de compatibilité ascendante n’est promise entre deux versions du plugin tant que la fonctionnalité reste marquée expérimentale.

Je recommande donc d’isoler ce genre de code dans un petit plugin dédié, clairement documenté, avec une note explicite indiquant qu’il cible une API en mouvement. Le jour où le comportement change de nom ou de signature, il suffira de mettre à jour ce seul fichier plutôt que de fouiller tout un thème.

Documenter pour ne pas se faire piéger plus tard

Sur chaque projet où j’utilise un filtre expérimental de ce type, j’ajoute un commentaire daté indiquant la version du plugin Gutenberg testée et un lien vers le ticket ou la discussion GitHub correspondante. Cette discipline coûte trente secondes et évite des heures de recherche quand quelque chose casse après une mise à jour.

Un filtre expérimental n’est pas un contrat. C’est une invitation à observer, pas une fondation sur laquelle bâtir un projet critique.

Notre verdict

Pour un site vitrine sans exigence de stabilité absolue, ce filtre ouvre déjà des possibilités concrètes et évite de recoder une boucle entière en PHP classique. Pour un projet critique, je préfère encore aujourd’hui une requête maîtrisée de bout en bout, quitte à perdre l’aspect visuel du bloc dans l’éditeur.

La suite dépendra de la manière dont ce prototype sera stabilisé dans les mois à venir. En attendant, ce filtre reste un excellent moyen de comprendre la mécanique interne de ces futures boucles de contenu.

Partager :

À propos de l'auteur

Clément Hadrot

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

Voir tous ses articles

Dans la même veine

À lire aussi