9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-06-30

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 );
9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?