WP REST APIを利用して記事のデータを取得するとき、標準の設定では返されるデータ内にカスタムフィールドの値は含まれません。
そこでフックを利用してカスタムフィールドの値を取得できるようにしてみます。
投稿データの取得
たとえば投稿のIDが16のものを取得したいとします。jQueryの$.getJSON
を用いて取得してみます。
$.getJSON(
'/wp-json/wp/v2/posts/16',
function (data, textStatus, jqXHR) {
// 取得後の操作
console.log(data);
}
);
ここで返されるデータは以下のようになります。
// http://samplesite.io/wp-json/wp/v2/posts/16
{
"id": 16,
"date": "2018-10-22T07:43:46",
"date_gmt": "2018-10-21T22:43:46",
"guid": {
"rendered": "http://samplesite.io/?p=16"
},
"modified": "2018-12-05T08:22:11",
"modified_gmt": "2018-12-04T23:22:11",
"slug": "%e3%83%86%e3%82%b9%e3%83%88",
"status": "publish",
"type": "post",
"link": "http://samplesite.io/2018/10/22/%e3%83%86%e3%82%b9%e3%83%88/",
"title": {
"rendered": "テスト投稿"
},
"content": {
"rendered": "<p>テスト投稿内容</p>\n",
"protected": false
},
...
}
ここにはカスタムフィールドのデータは含まれていません。
RESTで返されるデータを操作する
そこでREST APIが利用される際にカスタムフィールドの値も含めるという指示をfunctions.php
内に記述します。
まずフィルターフックはrest_api_init
を使い、データの登録をregister_rest_field
関数で行います。
functions.php
add_action( 'rest_api_init', 'add_custom_fields_to_rest' );
function add_custom_fields_to_rest() {
register_rest_field(
'post',
'custom_fields',
[
'get_callback' => 'get_custom_fields_value', // カスタム関数名指定
'update_callback' => null,
'schema' => null,
]
);
}
register_rest_field
関数の引数は以下のとおりです。
- 第1引数 : データを登録する対象オブジェクトpostやterm, commentなど
- 第2引数 : 返されるデータの属性名。JSONでデータを受け取る場合はキー名になります。
- 第3引数 : 登録するデータの扱い。連想配列で指定。
- get_callback : データの’取得’の際に利用されるコールバック関数名を指定。デフォルト値は
null
- update_callback : データの’編集’の際に利用されるコールバック関数名。デフォルト値は
null
- schema : データの構造を作成するためのコールバック関数名。デフォルト値は
null
- get_callback : データの’取得’の際に利用されるコールバック関数名を指定。デフォルト値は
投稿つまりpostのデータを呼び出す際にカスタムフィールドの値を含めるので、第1引数には'post'
を指定します。
第2引数ではJSONデータとして受け取った時のキー名を指定しています。値は任意で、ここでは仮に'custom_fields'
という名前にします。
第3引数では投稿データの取得の際にカスタムフィールドの値を含めたいので、get_callback
にget_custom_fields_value
(後述)という任意の関数名を指定します。
カスタムフィールドの値を含める関数の作成
前項でget_custom_fields_value
というカスタムのコールバック関数名を指定しましたが、まだ未作成なのでこれから作成し、カスタムフィールドの値を取得、JSONデータ内に含めるまでの操作を行います。
単純に投稿に紐づくカスタムフィールドの値全てを返す場合はget_post_custom
関数が使えます。
functions.php
function get_custom_fields_value() {
return get_post_custom();
}
get_post_custom [CODEX]
また特定のカスタムフィールドの値を含める際にはget_post_meta
関数を使います。
例えば投稿にtestfield
という名前のカスタムフィールドがあったとすると以下のように指定します。
function get_custom_fields_value() {
global $post;
return get_post_meta($post->ID, 'testfield');
}
get_post_meta [CODEX]
ここで改めてJSONのデータを見てみます。
{
...
"custom_fields": [
"テストだよん"
],
...
}
register_rest_field
関数の第2引数で指定した'custom_fields'
というキーに、取得したカスタムフィールドの値が紐付いていることが確認できると思います。
これがWP REST APIでカスタムフィールドの値を取得するまでの大まかな流れです。