Help us understand the problem. What is going on with this article?

WordPress 4.7以降でREST APIのレスポンスを加工する(ACFの値も追加可能)

More than 3 years have passed since last update.

WordPressのREST APIのレスポンス内容を必要な値のみに加工する方法です。
標準でREST APIが使用できるWordPress 4.7以降の話になります。

やること

記事一覧取得APIのレスポンスを、下記フォーマットに加工する

[
    {
        "post_id":"記事ID",
        "date":"公開日",
        "title":"タイトル",
        "url":"記事詳細ページのURL"
    },
    {
      
      
      
    }  
]

環境

WordPress 4.7.*
PHP >= 5.4

答え

functions.php
function my_rest_api_format( $response, $post, $request ) {

    // 記事ID取得
    $post_id = $response->data['id'];

    // 公開日時を公開日に変更
    $date = $response->data['date'];
    $ts = strtotime($date);
    $date = date('Y年m月d日',$ts);

    // 記事タイトル(20文字オーバーは三点リーダー)
    $title = wp_trim_words( $response->data['title']['rendered'], 20, '...' );

    // 記事詳細URL
    $url = $response->data['link'];


    // 加工したいフォーマットに整形
    $data_formatted = [
      'post_id' => $post_id,
      'date' => $date,
      'title' => $title,
      'url' => $url,
    ];

    return $data_formatted;
}

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

解説

アウトライン

REST APIのレスポンス処理中のフィルターフック rest_prepare_{$post_type} を使用します。
デフォルトの投稿データの場合は rest_prepare_post になります。

引数紹介

$response
レスポンスしようとしているデータの1件分が入っています。
レスポンス加工の基本の考え方は下記になります。

  • $response の中から、必要な値のみ取得する
  • 取得した値を、新しいフォーマットに当てはめてレスポンスさせる

$post_type
投稿タイプ

$request
REST APIを呼び出した時の情報が入っています。
呼び出し方によってレスポンスを変えたい時に使用します。

return値

このフィルターフックは、レスポンスする記事データ1件に対して1回実行されます。
returnもデータ1件分のデータになりますので注意してください。

ACFの値をレスポンスに含める

ACFの関数 get_field がこのフィルターフック内でも使用できます。
例えば
my_post_thumbnail
というACFキー名で、記事にサムネイル画像を保持できるようにしていると仮定します。
REST APIのレスポンスにサムネイル画像のURLを追加するコードは下記になります。

functions.php
function my_rest_api_format( $response, $post, $request ) {

    // 記事ID取得
    $post_id = $response->data['id'];

    // 公開日時を公開日に変更
    $date = $response->data['date'];
    $ts = strtotime($date);
    $date = date('Y年m月d日',$ts);

    // 記事タイトル(20文字オーバーは三点リーダー)
    $title = wp_trim_words( $response->data['title']['rendered'], 20, '...' );

    // 記事詳細URL
    $url = $response->data['link'];

    // サムネイル画像URL
    $thumbnail = get_field('my_post_thumbnail', $post_id);

    // 加工したいフォーマットに整形
    $data_formatted = [
      'post_id' => $post_id,
      'date' => $date,
      'title' => $title,
      'url' => $url,
      'thumbnail' => $thumbnail,
    ];

    return $data_formatted;
}

add_filter( 'rest_prepare_post', 'my_rest_api_format', 10, 3 );
d2cdot
テクノロジーの力で『伝えたいコトを伝わるカタチに』
https://www.d2cdot.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away