WordPressのREST APIのレスポンス内容を必要な値のみに加工する方法です。
標準でREST APIが使用できるWordPress 4.7以降の話になります。
やること
記事一覧取得APIのレスポンスを、下記フォーマットに加工する
[
{
"post_id":"記事ID",
"date":"公開日",
"title":"タイトル",
"url":"記事詳細ページのURL"
},
{
・
・
・
}
]
環境
WordPress 4.7.*
PHP >= 5.4
答え
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を追加するコードは下記になります。
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 );