Edited at

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

More than 1 year has 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 );