# wp_after_insert_post régénère un flux JSON de biens immobiliers publiés

> Ce hook introduit avec WordPress 5.6 attend que l'article soit vraiment enregistré pour reconstruire un fichier JSON consommé par le thème, sans les pièges de save_post.

- Auteur : WordPress Développement
- Publié le : 2021-12-15
- Mis à jour le : 2021-12-15
- Catégorie : Thèmes
- URL : https://www.wpmoderne.fr/themes/wp-after-insert-post-flux-json-biens-immobiliers/

## L’essentiel

- save_post se déclenche parfois trop tôt, avant que les métadonnées soient stables
- wp_after_insert_post garantit un état final de l'article
- Un fichier JSON statique reste plus rapide qu'une requête à chaque affichage

Décembre 2020 : WordPress 5.6 ajoute discrètement à son cœur un hook qui aurait pu éviter, un an plus tard, un bug agaçant sur un thème alimentant une carte interactive de biens immobiliers à partir d'un fichier JSON généré côté serveur. Ce fichier contenait encore les anciennes coordonnées d'un bien alors que sa fiche venait d'être republiée avec une adresse corrigée, et la cause tenait au hook utilisé pour régénérer ce fichier, qui se déclenchait trop tôt dans le cycle d'enregistrement de l'article.

Le hook `save_post`, longtemps utilisé par réflexe pour ce genre de traitement, se déclenche à un moment où certaines métadonnées liées à l'article ne sont pas encore toutes enregistrées, en particulier lorsque plusieurs actions accrochées à ce même hook s'exécutent dans un ordre qui dépend de leur priorité respective. Pour un flux JSON qui doit refléter l'état final et complet d'une fiche de bien, ce comportement introduit une source d'erreurs difficile à diagnostiquer.

## Le hook wp_after_insert_post

Introduit avec WordPress 5.6 en décembre 2020, le hook `wp_after_insert_post` se déclenche après que l'article et l'ensemble de ses métadonnées associées ont été définitivement enregistrés en base de données, y compris après le traitement des taxonomies rattachées. Il constitue une alternative plus fiable à `save_post` pour tout traitement qui dépend d'un état complet et final de l'article.

Sa signature transmet l'identifiant de l'article, l'objet complet de l'article, un booléen indiquant s'il s'agissait d'une mise à jour, et l'article tel qu'il existait avant la mise à jour :

```
function agence_regenerer_flux_biens( $post_id, $post, $update, $post_before ) {
    if ( 'bien_immobilier' !== $post->post_type ) {
        return;
    }
    if ( 'publish' !== $post->post_status ) {
        return;
    }
    agence_ecrire_flux_json();
}
add_action( 'wp_after_insert_post', 'agence_regenerer_flux_biens', 10, 4 );
```

## Pourquoi save_post posait problème ici

Sur ce projet, le flux JSON de biens immobiliers alimente une carte interactive affichée en façade du thème. Chaque fiche de bien porte des champs personnalisés (surface, prix, coordonnées géographiques) enregistrés via `update_post_meta()`, eux-mêmes accrochés au hook `save_post` par l'extension de champs personnalisés utilisée sur le projet.

> L'essentiel à retenir : save_post se déclenche parfois trop tôt, avant que les métadonnées soient stables ; wp_after_insert_post garantit un état final de l'article ; Un fichier JSON statique reste plus rapide qu'une requête à chaque affichage

Le problème venait de l'ordre d'exécution : la fonction de régénération du flux JSON, également accrochée à `save_post`, s'exécutait parfois avant que les champs personnalisés de coordonnées géographiques n'aient été enregistrés par l'extension, selon la priorité relative des deux fonctions. Le fichier JSON généré capturait alors un état intermédiaire de l'article, avec des coordonnées manquantes ou obsolètes.

## La correction avec wp_after_insert_post

En remplaçant l'accroche sur `save_post` par une accroche sur `wp_after_insert_post`, la fonction de régénération du flux JSON s'exécute désormais après que toutes les métadonnées de l'article, y compris celles ajoutées par les extensions tierces, ont été définitivement enregistrées. Le fichier JSON reflète alors systématiquement l'état final de la fiche de bien, sans dépendre de l'ordre de priorité des différentes fonctions accrochées.

- Le hook se déclenche après l'insertion complète, taxonomies comprises
- Il fournit l'état de l'article avant modification, utile pour détecter un changement de statut
- Il évite les conditions de course entre plusieurs fonctions accrochées à save_post
- Il reste disponible aussi bien en création qu'en mise à jour d'article

## Écrire le fichier JSON

La fonction `agence_ecrire_flux_json()` reconstruit l'intégralité du fichier à partir d'une requête sur l'ensemble des biens publiés, plutôt que de tenter une mise à jour incrémentale du fichier existant, plus complexe à fiabiliser :

```
function agence_ecrire_flux_json() {
    $biens = get_posts( array(
        'post_type'      => 'bien_immobilier',
        'post_status'    => 'publish',
        'posts_per_page' => -1,
    ) );

    $donnees = array();
    foreach ( $biens as $bien ) {
        $donnees[] = array(
            'titre'  => get_the_title( $bien ),
            'prix'   => get_post_meta( $bien->ID, 'prix', true ),
            'lat'    => get_post_meta( $bien->ID, 'latitude', true ),
            'lng'    => get_post_meta( $bien->ID, 'longitude', true ),
        );
    }

    file_put_contents(
        WP_CONTENT_DIR . '/uploads/biens-immobiliers.json',
        wp_json_encode( $donnees )
    );
}
```

## Ce qui reste hors de ce périmètre

Ce traitement régénère le fichier à chaque publication ou mise à jour d'un bien, ce qui suffit pour un volume raisonnable de fiches. La question de la mise en cache de ce fichier généré, ou de son invalidation côté CDN si le site en utilise un, relève d'une problématique de performance distincte, qui mérite un traitement à part entière.

> Sur ce genre de traitement, mieux vaut toujours régénérer l'intégralité du fichier plutôt que de tenter une mise à jour partielle. La complexité d'un correctif incrémental dépasse rarement le coût, en pratique négligeable, d'une reconstruction complète.

## En résumé

`wp_after_insert_post` résout une catégorie précise de problèmes liés à l'ordre d'exécution des hooks autour de l'enregistrement d'un article. Pour tout traitement qui dépend de l'état complet et final d'une fiche, en particulier lorsque plusieurs extensions enregistrent des métadonnées sur le même hook `save_post`, ce hook introduit avec WordPress 5.6 offre une garantie que `save_post` ne peut pas fournir seul.
