WP REST APIで投稿データを取得する際にカスタムフィールドの値を含める方法

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

投稿つまりpostのデータを呼び出す際にカスタムフィールドの値を含めるので、第1引数には'post'を指定します。

第2引数ではJSONデータとして受け取った時のキー名を指定しています。値は任意で、ここでは仮に'custom_fields'という名前にします。

第3引数では投稿データの取得の際にカスタムフィールドの値を含めたいので、get_callbackget_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でカスタムフィールドの値を取得するまでの大まかな流れです。