この記事をおすすめしたい人
- WordPressで独自APIを実装しようとしている人
- WordPressで複数のAPIをまたぐデータを取得しようとしている人
- つまりオレ
今回はWordPressのREST APIの独自API実装をやってみます。
実際にどういう事例で独自APIが必要になったのか、実際に実装した例も含めて書いてみたいと思います。
以前、独自APIの万能感が気に入らないって言ったんですが、なぜ独自APIで実装しようと思ったかあたりも軽く書いてみます。 興味ない人はすっ飛ばしてください。
独自APIが必要になった経緯
WordPressとNuxt.jsの共存サイトを作ろうとしたからです。
基本的にはWordPressで作られたサイトで、JavaScriptでデータ処理をしたいページは一部Nuxt.jsで作る、というものです。
この時に、メインをWordPressにするのかNuxt.jsにするのか、とか、Nuxt.jsとの共存のさせ方をかなり悩んだんですが、それはまた別の機会にまとめるとして、以下、WordPressメイン+一部Nuxt.jsを作るものとして書きます。
希望していた共存のさせ方
既に稼動しているので実例を見てもらいましょう。
こんな感じでどちらのシステムで動いていても、ヘッダ、フッタ、サイドバーを共通にしたかったんですね。
WordPress側から持ってこないといけないデータ
制作したサイトはこのサイトと同様で、サイドバーに次の3つの要素があります。
- 最近の投稿5件
- カテゴリ一覧
- 人気の投稿5件
これらはそれぞれ、次のAPIで取得できます。
- 記事APIを日付でソート
- カテゴリAPI
- 記事APIをカスタムフィールドでソート
つまり、データの内容が小さいのに、3回もAPIを叩かないといけないんです。
これをページ開く度にやるのは非効率極まりないと考えたため、独自APIで1個にまとめてやろうというのが今回の趣旨です。
独自APIがお手軽だから選んだのではなくて、既存のAPIで出来ないから独自APIでやろうってことです。
独自API追加の方法
WordPress公式を参考にしました。
英語だし、CSSが効いてないし、読みやすいとは言いづらいんですが、内容はとてもシンプルなので大丈夫。
まずは独自APIを登録
アクションフックで「register_rest_route」を「rest_api_init」に登録↓します。
<?php
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/author', array(
'methods' => 'GET',
'callback' => 'my_awesome_func',
));
});
このうち、自分でカスタマイズしなければならないのが、赤字にした3点↓です。 他は固定。
<?php
add_action('rest_api_init', function () {
register_rest_route('myplugin/v1', '/author', array(
'methods' => 'GET',
'callback' => 'my_awesome_func',
));
});
「myplugin/v1」と「/author」の2つはアクセスするAPIのURLを決める部分です。 この例だとURLは「https://dev.ore-shika.com/wp-json/ myplugin/v1 /author/」になります。
独自APIの記事を見ていると「v1」とバージョンを表していそうな文字列がたいてい入っていて、WordPressが生成するAPIにも入っています。 今回実装するのは自分が使うだけのしょぼいやつなので
バージョン管理なんていらんのやけど…。
と「myplugin」だけで登録してみましたが普通に動きました。
つまり、自分が追加したAPIであることを明示する識別子をXXXXXXXXX、そのうちのどういうAPIかを決めるキー(記事とか著者とか)をYYYYYYYYYとすると、こんな↓感じになります。
<?php
add_action('rest_api_init', function () {
register_rest_route('XXXXXXXXX', '/YYYYYYYYY', array(
'methods' => 'GET',
'callback' => 'my_awesome_func',
));
});
「my_awesome_func」はAPIが返す値を決める関数の名前です。 自分で実装するので名前はなんでもOKです。
つか、アクションフックの時にこうやって無名関数を使う書き方、スマートですね。
いつも名前を考えるのがめんどくさいんです。
APIが返す値を決める関数(コールバック関数)
正式にはコールバック関数と呼ぶそうです。 僕はまともにプログラムを勉強したことがないのでコールバックという呼び方がどうもピンと来なくて、今回は「APIが返す値を決める関数」としました。
形はとてもシンプルで、APIのパラメータを引数「$data」で受け取って、連想配列にして返すだけ。
<?php
function my_awesome_func( $data ) {
$result = [];
//返す値を計算
return $result;
}
APIってJSON形式だと思うんで連想配列で使っていますが、公式のサンプルでは単体の変数(文字列)を返していたので、それでもいけるっぽい。
連想配列の場合は、特に意識しなくても思った通りにJSON化してくれます。 キーなしの配列はただの配列に、キー有りの配列はオブジェクトに変換されます。
実際の独自API実装例
出来上がったAPIはこんな↓感じです。
https://ore-game.com/imsaga-ec/wp-json/myapi/sidebar/
中身を成形するとこんな↓感じ。
{
"recent": [
{
"title": "(記事タイトル)",
"url": "(記事URL)",
"img": "(記事サムネイルURL)"
},
...
],
"cats": [
{
"name": "(カテゴリ名)",
"url": "(カテゴリURL)",
"count": (カテゴリの記事数)
},
...
],
"popular": [
{
"title": "(記事タイトル)",
"url": "(記事URL)",
"img": "(記事サムネイルURL)"
},
...
]
}
「recent」は「最近の投稿」で、要素は記事の配列で、記事タイトル・URL・サムネURLの3点を持たせています。
「cats」は「カテゴリ一覧」で、子要素は名前・URL・記事数を持たせています。
「popular」は「人気の投稿」で、構造は「recent」と同様。
出力部分の関数はこんな↓感じ。
function myapi_sidebar_func( $data ) {
$result = [];
$result['recent'] = get_recent_api();
$result['cats'] = get_cats_api();
$result['popular'] = get_popular_api();
return $result;
}
それぞれの関数の中身は独自APIというよりはWordPressの問題だと思うので今回は割愛します。