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

Thèmes

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.

Par WordPress Développement • 15 décembre 2021 • 5 min de lecture • Aucun commentaire
wp_after_insert_post régénère un flux JSON de biens immobiliers publiés

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.

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