WordPressのREST APIから記事取得時に、まとめてカテゴリ詳細も取得する

シェアする:

この記事をおすすめしたい人

  • WordPressの記事REST APIにカテゴリ情報を含めたい人
  • WordPressの記事REST APIにタグ情報を含めたい人
  • つまりオレ

今回はWordPressのREST APIから記事を取得した際に、合わせてカテゴリの詳細を取得します。

このサイトは記事の末尾に所属カテゴリへのリンクを貼っていますが、それを再現するための方法です。

カテゴリを例にあげていますが、タグの場合も同様です。 「categories」の部分を「tags」に置き換えるだけでいけます。

アプローチとしては大きく2つあるので両方紹介したいと思います。

カテゴリもREST APIで取得

REST APIから記事を取得するとデフォルトで以下のようなカテゴリID配列が含まれています。


"categories": [
  14,
  8
],

IDが分かればカテゴリのAPIを叩いて詳細情報を取得できます。

/wp/v2/categories/14
/wp/v2/categories/8

ただし、この場合、記事API含め、3回のAPIを叩く必要があります。

カテゴリが10個あったら計11回APIを叩くことになります…。

複数カテゴリがあっても1回のAPIで全カテゴリを取得する方法

公式マニュアルを見ると非常に簡単な方法が分かりました。

記事のIDを指定すると、その記事が所属するカテゴリの配列を取得できます。

上の14と8というカテゴリIDは、REST APIから「_links」を削除する記事のもので、この記事のIDは103です。

この場合、次のようにAPIを叩くとカテゴリ一覧を取得できます。
/wp/v2/categories?post=103

めちゃくちゃ便利ですね、コレ。

APIでカテゴリを取得する問題点

いずれの方法にせよ、複数回APIを叩く点です。

APIは外部サイトから通信して使うもの(多分)で、今のご時世、外部サイトからの通信は極力減らしたいです。

カテゴリIDでAPIを叩く場合には記事APIで1回+所属カテゴリ数、APIを叩く必要があります。 カテゴリを2つ持ってたら3回通信です。

記事IDから全カテゴリを取得する場合にも2回の通信が必要になります。

記事API自体にカテゴリ情報を含めてしまう

REST APIにカスタムフィールドアイキャッチを追加した時と同様に、記事API自体に必要なカテゴリ情報を含めてしまう方法です。

この方法だと、記事API取得だけで完結するので1回の通信で済みます。

具体的には「rest_api_init」というアクションフックを使って、APIにカテゴリ情報を追加します。 「rest_api_init」についてはカスタムフィールド追加の記事で詳しく書きました。

PHPのコード

以下のコードをfunctions.phpに追加すると、記事APIにカテゴリ情報を含めることができます。


add_action( 'rest_api_init', 'api_add_fields' );
function api_add_fields() {
  register_rest_field( 'post',
    'cat_info',
     array(
      'get_callback'    => 'register_fields',
      'update_callback' => null,
      'schema'          => null,
    )
  );
}
function register_fields( $post, $name ) {
  return get_the_category($post['id']);
}

get_the_category()は記事に含まれるカテゴリ一覧を連想配列で返すので、そのままAPIに放り込むことができます。

カテゴリ部分の出力結果はこんな↓感じになります。


"cat_info": [
  {
    "term_id": 14,
    "name": "REST API",
    "slug": "wp-rest-api",
    "term_group": 0,
    "term_taxonomy_id": 14,
    "taxonomy": "category",
    "description": "",
    "parent": 8,
    "count": 9,
    "filter": "raw",
    "cat_ID": 14,
    "category_count": 9,
    "category_description": "",
    "cat_name": "REST API",
    "category_nicename": "wp-rest-api",
    "category_parent": 8
  },
  {
    "term_id": 8,
    "name": "WordPress",
    "slug": "wp",
    "term_group": 0,
    "term_taxonomy_id": 8,
    "taxonomy": "category",
    "description": "",
    "parent": 0,
    "count": 12,
    "filter": "raw",
    "cat_ID": 8,
    "category_count": 12,
    "category_description": "",
    "cat_name": "WordPress",
    "category_nicename": "wp",
    "category_parent": 0
  }
]

カテゴリの必要な情報だけ含めるコード

上のコードだとPHP部分は簡単ですが、カテゴリの要素がWordPressそのままになっていて、無駄が多いし「id」がないので直感的でない部分もあります。

それを解決するためにコールバック関数を書き換えたコードがコレ↓です。


function register_fields( $post, $name ) {
  $cats = get_the_category($post['id']);
  
  $data = array();
  
  foreach ( $cats as $cat ) {
    $current = array();
    
    $current['id'] = $cat->term_id;
    $current['slug'] = $cat->slug;
    $current['name'] = $cat->name;
    $current['url'] = get_category_link($cat->term_id);
    
    array_push($data, $current);
  }
  
  return $data;
}

URLが欲しい人もいると思うのでWordPress側で先にカテゴリページのURLを取得しています。

出力結果はこんな↓感じになります。


"cat_info": [
  {
    "id": 14,
    "slug": "wp-rest-api",
    "name": "REST API",
    "url": "https://dev.ore-shika.com/cat/wp/wp-rest-api/"
  },
  {
    "id": 8,
    "slug": "wp",
    "name": "WordPress",
    "url": "https://dev.ore-shika.com/cat/wp/"
  }
]

上記コードの注意点

APIに追加するキー「cat_info」の部分。

普通に考えると「categories」とか付けてしまいそうですが、「categories」にするとデフォルトで入っている「categories」を上書きしてしまいます。

上書きしてしまって問題ないことを確認している場合は問題ありませんが、上書きされると困る場合(categories以下にカテゴリID配列が入ってるものとして既に処理してる場合など)は別の名前にしましょう。

まぁ内容的には上位互換なので問題ないケースが多いと思います。

コピペで使えるまとめ

WordPressの記事APIにカテゴリ情報を追加するコードまとめです。 以下のコードをfunctions.phpにコピペするだけで使えます。


add_action( 'rest_api_init', 'api_add_fields' );
function api_add_fields() {
  register_rest_field( 'post',
    'cat_info',
     array(
      'get_callback'    => 'register_fields',
      'update_callback' => null,
      'schema'          => null,
    )
  );
}
function register_fields( $post, $name ) {
  return get_the_category($post['id']);
}

「cat_info」の部分は他のキーと重複しないよう注意が必要です。 自分で追加してない限りは「cat_info」のままだとたぶん大丈夫です。

以上、WordPressからお届けしました!

シェアする: