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.

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.