# pre_render_block court-circuite le rendu d’un bloc dans un template

> Remplacer entièrement le rendu d'un bloc précis, sans le désenregistrer, grâce à un filtre du cœur qui intercepte le HTML avant qu'il ne soit produit.

- Auteur : WordPress Développement
- Publié le : 2021-02-13
- Mis à jour le : 2021-02-13
- Catégorie : Éditeur de site (FSE)
- URL : https://www.wpmoderne.fr/fse/pre-render-block-court-circuite-rendu-bloc/

## L’essentiel

- Le filtre reçoit le contenu et les attributs du bloc
- Retourner une chaîne non nulle court-circuite tout le reste
- Utile pour un remplacement conditionnel sans toucher au bloc d'origine

`if ( null !== $pre_render ) { return $pre_render; }` — cette ligne, extraite du cœur de WordPress, résume à elle seule tout l'intérêt du filtre `pre_render_block` : dès qu'une valeur non nulle est retournée, le rendu normal du bloc est purement et simplement ignoré.

Ce billet s'adresse aux développeurs avancés qui veulent remplacer le rendu d'un bloc précis, utilisé dans un gabarit ou un fragment de gabarit, sans pour autant désenregistrer ce bloc ni modifier son code source. Il ne traite pas des transients, qui répondent à un besoin différent — celui de mise en cache plutôt que de substitution de rendu.

## Ce que fait réellement ce filtre

Le filtre `pre_render_block` s'exécute avant que WordPress ne génère le HTML final d'un bloc. Il reçoit en paramètre le contenu potentiellement pré-calculé (généralement `null` au premier passage) ainsi que le tableau représentant le bloc parsé, avec son nom et ses attributs.

```
add_filter( 'pre_render_block', function( $pre_render, $bloc ) {
    if ( 'core/latest-posts' !== $bloc['blockName'] ) {
        return $pre_render;
    }

    return '<div class="remplacement-personnalise">Contenu de remplacement</div>';
}, 10, 2 );
```

Dans cet exemple, tout bloc `core/latest-posts` présent dans un gabarit ou un fragment de gabarit voit son rendu habituel entièrement ignoré, remplacé par le contenu retourné par le filtre.

## Pourquoi ne pas simplement désenregistrer le bloc

Désenregistrer un bloc avec `unregister_block_type()` le rend indisponible partout, y compris dans l'éditeur, où il disparaîtrait purement et simplement de l'inserteur de blocs. Le filtre `pre_render_block` propose une alternative plus ciblée : le bloc reste disponible et modifiable normalement dans l'éditeur, seul son affichage final change, et uniquement dans les conditions définies par le développeur.

- Le bloc reste visible et éditable dans l'éditeur, contrairement à un bloc désenregistré.
- Le remplacement peut être conditionnel — selon le gabarit, la page, ou tout autre contexte.
- Le filtre s'applique aussi bien aux gabarits qu'aux fragments de gabarit, sans distinction.

## Un cas d'usage concret dans un fragment de gabarit

> L'essentiel à retenir : Le filtre reçoit le contenu et les attributs du bloc ; Retourner une chaîne non nulle court-circuite tout le reste ; Utile pour un remplacement conditionnel sans toucher au bloc d'origine

Imaginons un fragment de gabarit utilisé comme en-tête, contenant un bloc de recherche que l'on souhaite remplacer par un champ personnalisé plus riche, sans réécrire tout le fragment ni créer un bloc entièrement nouveau :

```
add_filter( 'pre_render_block', function( $pre_render, $bloc, $instance ) {
    if ( 'core/search' !== $bloc['blockName'] ) {
        return $pre_render;
    }

    ob_start();
    get_template_part( 'template-parts/recherche-personnalisee' );
    return ob_get_clean();
}, 10, 3 );
```

Le troisième paramètre, l'instance du bloc au format `WP_Block`, donne accès au contexte complet dans lequel le bloc s'exécute, ce qui permet des remplacements encore plus fins si nécessaire.

## Les limites à connaître

Ce filtre s'applique globalement, à tous les blocs du même type sur l'ensemble du site, sauf condition explicite dans le code. Un remplacement mal ciblé peut donc avoir des effets de bord inattendus sur des pages où le remplacement n'était pas souhaité. Une vérification systématique du contexte, avant de retourner un contenu de remplacement, reste indispensable.

> Un filtre puissant appliqué sans condition finit toujours par surprendre quelqu'un, souvent plusieurs mois après sa mise en place, quand le contexte d'origine a été oublié.

## Une alternative à connaître

Pour des remplacements plus limités, portant uniquement sur le contenu final déjà généré plutôt que sur le rendu entier, le filtre `render_block` — qui s'exécute après le rendu normal — peut suffire et s'avère parfois plus simple à raisonner que `pre_render_block`, qui court-circuite tout.

## En résumé

Le filtre `pre_render_block` offre un point d'intervention précis pour remplacer entièrement le rendu d'un bloc, dans un gabarit comme dans un fragment de gabarit, sans toucher à son enregistrement. Sa puissance impose en retour une discipline de conditionnement stricte, sous peine de propager un remplacement à des contextes qui n'en avaient pas besoin.
