🐕

WordPress のRest APIに項目を追加する

2024/02/26に公開

WordPress のRest API はデフォルトのままではかなり使いにくいです。

デフォルトのAPIの問題点

たとえば/wp-json/wp/v2/posts/1などのAPIを叩いて記事詳細を取得します。

カテゴリーの情報は利用しよう取得したJSONを見に行くと以下のような値が返却されています。

{
  id: 1,
  ...,
  categories: [ 1 ],
  ...,
}

カテゴリーのid情報のみが返却されており、このままではslugや名前が利用できないので /wp-json/wp/v2/categories/${categories[0]} などを叩いて以下のようなカテゴリー詳細情報を取得する必要があります。

{
  id: 1,
  name: 'マイカテゴリー名',
  slug: 'my_category_slug',
  taxonomy: 'category',
  ...,
}

これは1つの情報取得のために、複数のリクエストが発生するN+1問題と呼ばれる状態でパフォーマンスを考慮すると望ましくはありません。

この状態を改善するために/wp-json/wp/v2/posts/1のレスポンス内にカテゴリーのslugや名前も返却されるようにする必要があります。

WordPress のRest APIにカテゴリー以外でもデフォルトでは情報が少なくそのまま利用するのは少し難しいです。

カテゴリーの追加

functions.phpに以下の処理を追加します。

functions.php
/*
 * APIにフィールドを追加
 */
add_action('rest_api_init', 'add_api_fields');
function add_api_fields()
{
  // カテゴリーの追加
  register_rest_field(
    'post',
    'categories_info',
    array(
      'get_callback'    => 'register_categories_fields',
      'update_callback' => null,
      'schema'          => null,
    )
  );
}

// カテゴリー情報の追加
function register_categories_fields($post)
{
  $categories = get_the_category($post['id']);

  $data = array();
  foreach ($categories as $category) {
    $current = array();
    $current['slug'] = $category->slug;
    $current['name'] = $category->name;
    array_push($data, $current);
  }

  return $data;
}

これはAPIレスポンスの作成時にcategories_infoという名前でカテゴリーのslugや名前を追加する設定です。

こちらで/wp-json/wp/v2/posts/1のレスポンスを確認して見ると以下のようなっています。

{
  id: 1,
  ...,
  categories: [ 1 ],
  categories_info: [ { slug: 'my_category_slug', name: 'マイカテゴリー名' } ],
  ...,
}

このようにPOSTのレスポンス内に項目を増やしていくことでRest APIが格段に利用しやすくなっていきます。

タグの追加

同様にadd_api_fieldsを拡張してタグの情報もPOSTのレスポンス内に追加してみましょう。

functions.php
/*
 * APIにフィールドを追加
 */
add_action('rest_api_init', 'add_api_fields');
function add_api_fields()
{
  // カテゴリーの追加
  ...

  // タグの追加
  register_rest_field(
    'post',
    'tags_info',
    array(
      'get_callback'    => 'register_tags_fields',
      'update_callback' => null,
      'schema'          => null,
    )
  );
}

// カテゴリー情報の追加
...

// タグ情報の追加
function register_tags_fields($post)
{
  $tags = get_the_tags($post['id']);

  $data = array();
  foreach ($tags as $tag) {
    $current = array();
    $current['slug'] = $tag->slug;
    $current['name'] = $tag->name;
    array_push($data, $current);
  }

  return $data;
}

これでAPIレスポンス内にtags_infoという名前でタグのslugや名前が追加されています。

投稿者情報の追加

投稿者情報はget_the_author_metaget_user_metaget_avatar_urlといった具合に取得する関数が分かれているので必要な情報を取得して追加していきましょう。

今回はslugと名前、説明と画像のURLを追加するサンプルです。

functions.php
/*
 * APIにフィールドを追加
 */
add_action('rest_api_init', 'add_api_fields');
function add_api_fields()
{
  // カテゴリーの追加
  ...

  // タグの追加
  ...

  // 投稿者情報の追加
  register_rest_field(
    'post',
    'author_info',
    array(
      'get_callback'    => 'register_author_fields',
      'update_callback' => null,
      'schema'          => null,
    )
  );
}

// カテゴリー情報の追加
...

// タグ情報の追加
...

// 投稿者情報の追加
function register_author_fields()
{
  $authorId = get_the_author_meta('ID');
  $authorMeta = get_user_meta($authorId);

  $data = array();
  $data['slug'] = get_the_author_meta('nicename');
  $data['name'] = get_the_author_meta('display_name');
  $data['description'] = $authorMeta['description'][0];
  $data['avatar_url'] = get_avatar_url($authorId);

  return $data;
}

これで、author_infoというプロパティに投稿者情報の追加されるようになります。

アイキャッチ画像

アイキャッチ画像を追加したい場合はget_the_post_thumbnail_url関数を利用します。

functions.php
/*
 * APIにフィールドを追加
 */
add_action('rest_api_init', 'add_api_fields');
function add_api_fields()
{
  // カテゴリーの追加
  ...

  // タグの追加
  ...

  // 投稿者情報の追加
  ...

  // アイキャッチの追加
  register_rest_field(
    'post',
    'thumbnail_url',
    array(
      'get_callback'    => 'register_thumbnail_fields',
      'update_callback' => null,
      'schema'          => null,
    )
  );
}

// カテゴリー情報の追加
...

// タグ情報の追加
...

// 投稿者情報の追加
...

// アイキャッチの追加
function register_thumbnail_fields($post)
{
  return get_the_post_thumbnail_url($post['id'], 'full');
}

これでthumbnail_urlというプロパティにアイキャッチ画像が追加されるようになります。

このようにWordPress のRest APIはひと手間かけることで格段と使いやすくすることができます。

株式会社トゥーアール

Discussion