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

Astuces

rest_prepare_post : ajouter un champ calculé à l’API REST sans nouvel endpoint

Une application mobile a besoin d'un champ que l'API REST native ne fournit pas. Plutôt que créer un endpoint dédié, le filtre rest_prepare_post permet d'enrichir la réponse existante en quelques lignes.

Par WordPress Développement • 25 mai 2024 • 4 min de lecture • Aucun commentaire
rest_prepare_post : ajouter un champ calculé à l'API REST sans nouvel endpoint

La documentation officielle de l’API REST de WordPress précise que chaque type de contenu déclenche un filtre dynamique nommé rest_prepare_{$post_type} juste avant l’envoi de la réponse, permettant de modifier ou d’enrichir les données transmises. Pour le type post, ce filtre se nomme rest_prepare_post, et il constitue la voie la plus directe pour ajouter un champ calculé sans construire un nouvel endpoint entier.

Une application mobile qui consomme l’API REST pour afficher la liste des articles a par exemple besoin d’un temps de lecture estimé, calculé à la volée depuis le nombre de mots du contenu. Ce champ n’existe pas nativement dans la réponse, et créer une route personnalisée uniquement pour l’exposer serait disproportionné par rapport au besoin réel.

Étape 1 : déclarer le champ dans le schéma REST

Avant de remplir une valeur, il faut déclarer le champ pour qu’il apparaisse dans le schéma de l’API et reste documenté pour les consommateurs futurs, via register_rest_field() :

add_action( 'rest_api_init', 'wpm_declarer_champ_temps_lecture' );

function wpm_declarer_champ_temps_lecture() {
    register_rest_field( 'post', 'temps_lecture_estime', array(
        'get_callback' => 'wpm_calculer_temps_lecture',
        'schema'       => array(
            'description' => 'Temps de lecture estimé en minutes',
            'type'        => 'integer',
            'context'     => array( 'view' ),
        ),
    ) );
}

Étape 2 : écrire la fonction de calcul

function wpm_calculer_temps_lecture( $post_data ) {
    $contenu    = get_post_field( 'post_content', $post_data['id'] );
    $nb_mots    = str_word_count( wp_strip_all_tags( $contenu ) );
    $mots_minute = 200;

    return (int) ceil( $nb_mots / $mots_minute );
}
L'essentiel à retenir : Le filtre rest_prepare_post enrichit la réponse d'un endpoint déjà existant ; Aucun nouvel endpoint ni route personnalisée n'est nécessaire ; Le champ calculé reste disponible pour toute application consommant l'API

Cette fonction s’appuie sur wp_strip_all_tags() pour ne compter que le texte réel, sans que les balises HTML du contenu ne faussent le décompte de mots, puis divise ce total par une moyenne de lecture de 200 mots par minute, une estimation courante pour du contenu en français.

Étape 3 : vérifier le résultat

Une requête vers /wp-json/wp/v2/posts fait désormais apparaître le champ temps_lecture_estime directement dans chaque objet de la réponse, sans route supplémentaire à documenter ni à maintenir séparément :

{
    "id": 42,
    "title": { "rendered": "Titre de l'article" },
    "temps_lecture_estime": 4
}

Étape 4 : enrichir davantage avec rest_prepare_post

Pour des besoins qui dépassent un simple champ calculé, par exemple ajouter un objet imbriqué construit à partir de plusieurs métadonnées, le filtre rest_prepare_post offre un contrôle plus large que register_rest_field() :

add_filter( 'rest_prepare_post', 'wpm_enrichir_reponse_post', 10, 3 );

function wpm_enrichir_reponse_post( $response, $post, $request ) {
    $response->data['auteur_details'] = array(
        'nom'   => get_the_author_meta( 'display_name', $post->post_author ),
        'photo' => get_avatar_url( $post->post_author ),
    );

    return $response;
}

Choisir entre les deux approches

Pour un champ simple et scalaire, register_rest_field() reste préférable car il documente correctement le champ dans le schéma exposé par l’API. Pour des structures plus complexes ou des modifications qui dépendent du contexte de la requête, comme le paramètre $request, le filtre rest_prepare_post devient nécessaire.

Étape 5 : limiter le calcul aux contextes utiles

Un calcul de temps de lecture exécuté sur chaque article d’une réponse contenant cent éléments peut alourdir légèrement le temps de réponse. Une vérification du paramètre context de la requête permet de ne calculer ce champ que lorsque la vue complète est demandée :

  • Retourner une valeur nulle par défaut si le contexte de la requête est embed, plus léger.
  • Réserver le calcul complet au contexte view, utilisé pour l’affichage détaillé d’un article.
  • Mettre en cache la valeur calculée dans une métadonnée si le volume d’articles devient important, pour éviter un recalcul à chaque requête.

Conseil maison : avant de créer un nouvel endpoint personnalisé, vérifiez toujours si un champ calculé ajouté à une réponse existante ne suffit pas. La maintenance d’une route en moins, c’est une surface d’erreur en moins pour toute l’équipe.

En résumé

Enrichir une réponse REST existante avec register_rest_field() ou rest_prepare_post évite bien souvent la lourdeur d’un nouvel endpoint dédié. Ces deux outils cœur suffisent à répondre à l’immense majorité des besoins d’une application consommant l’API, tant que la donnée ajoutée reste calculable depuis les informations déjà accessibles à WordPress.

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