私にもありました。Wordpressでの一覧呼び出しはJs+RestAPIが正義だと思っていた時代が。。。

皆さんはWP REST APIを使用したことがありますか?

json形式で投稿を扱えるのですごく便利なのですが、「この情報が含まれていないからエンドポイントに追加したい」ということが割りと起こります。

特にカテゴリーはidしか含まれていないので、取得後、さらにカテゴリー名を取得しに行くという2度手間が発生します。

そこで今回はWP REST APIのエンドポイントにカテゴリー名やカテゴリーに付随する情報を追加してみましょう。

# この記事で解決すること

  • WP REST APIのエンドポイント(post_type)にカテゴリー名を挿入することができる
  • WP REST APIのエンドポイント(post_type)にカテゴリーに付随する情報を挿入することができる

 

前提

今回はカテゴリーのname,slug,link,custom_fieldをpost_typeのエンドポイントに追加することとします。

対象

  • WP REST APIを使用している方
  • REST APIのデータをphp側で処理しておきたい方

編集ファイル

  • theme_name
    • functions.php

手順

  1. カテゴリーの情報を取得する
  2. 任意のエンドポイントに情報を追加
  3. 確認

カテゴリーの情報を取得する

functions.php

// $object = 投稿のデータ
function get_category_info( $object ) {

  // returnする配列の初期化
  $categories = array();

  // 投稿に紐づくカテゴリーの情報取得
  $category = get_the_category($object['id']);

  // 投稿に紐づくカテゴリーを一つずつ処理
  foreach ($category as $k => $v) {
    $categories[$k]['name'] = $v->cat_name;                   // category_name
    $categories[$k]['slug'] = $v->slug;                       // category_slug
    $categories[$k]['link'] = get_category_link($v->term_id); // category_link

    // 例えばACFでカテゴリーに'color'設定している場合
    if(get_field('color','category_'.$v->term_id)) {
      $categories[$k]['color'] = get_field('color','category_'.$v->term_id);
    }
  }
  // 必要な部分だけ取り出したカテゴリーの情報をreturn
  return $categories;
}

後述しますが、2行目の$objectにはとりあえず投稿のデータが入るんだと思っておいてください。

array_pushしていないのは、無駄な処理を増やしたくなかったからです。

あとはすごく単純なカテゴリー情報の処理ですね。

任意のエンドポイントに情報を追加

では、上記で取得した情報をpost_typeのエンドポイントに追加します。

今回はわかりやすいようにpostにしておきます。

functions.php

add_action( 'rest_api_init', 'register_category_info' );
function register_category_info() {
  register_rest_field( 'post', 'category_info',
    array(
      'get_callback' => 'get_category_info'
    )
  );
}

rest_api_initに対してアクションフックをかけます。

あとはregister_rest_fieldpostのエンドポイントに対してcategory_infoを追加して、その中に前項のget_category_infoで取得した情報を代入しています。

postcallbackに投稿データが紐づいているので、$object=投稿データとなります。

これでpostのエンドポイントにカテゴリーの情報を追加することができました。

確認

念のために確認しておきましょう。

※カスタムフィールドはあくまで記述例ですので、今回の実装には含まれません。

既存のcategoriesとは別にcategory_infoがあるのがわかりますね。

最後に

私は1周してPHPでの取得に戻っていますが、仕様によってはどうしてもREST APIを使用しなければいけないこともあります。

REST APIは使い方さえ覚えればすごく楽しく扱うことができます。

MovableTypeでもData APIがあり、REST APIは今後も発展していくんでしょうね。

では皆様よいWPライフを!