WP REST API サイトの主要なページをじっくり読んだところで、次は習うより慣れろということで、リクエストいっぱいしてみて、レスポンスをじっくり見てみよう、という趣向で進めてみたいと思います。
前提として、以下の記事を読んでおくと、話がよく分かると思います。
また作業にあたり、Mさんこと @miya0001 さんから Paw – The ultimate REST client for Mac という、REST クライアントを紹介してもらいましたので使ってみました。
Paw is a full-featured and beautifully designed Mac app that makes interaction with REST services delightful. Whether you are an API maker or consumer, Paw helps you build HTTP requests, inspect the server’s response and even generate client code.
Paw は機能フル装備の美しい Mac 用アプリで、REST サービスとのインタラクションを快適にします。API を開発するひとにとっても、使う人にとっても、HTTP リクエストをビルドしたり、サーバからのレスポンスを詳しく見てみたり、さらにはクライアントコードを生成してみたりするのに便利です。
いやー、実を言いますと httpie はとっても手軽なんですけど長い json がどわーっと来ると目的の key を探したりするのが不便で困っていたんです。手元でパッとテストするにはとてもいいのですが、使い分けですね。
ということで、
- エンドポイントやリクエスト内容を整理して保存
- レスポンスを綺麗に見る
- 自分が何をやっているのか見て分かるようになる
ということのためによさそうです。まずは30日間の Trial ができるということです。
インストールするとこんな感じで、
- アクションを選び、
- URL を入れて
- パラメータを指定する
ための画面が出てきました。とりあえず、
- Contact Form 7 に POST をしてみる(参考: http リクエストをターミナルからお試しする httpie)
- /wp-json にアクセスしてみる(参考: WP REST API ドキュメント Discovery)
- 投稿やカテゴリーやユーザーを取得してみる
というのをやってみます。
Paw では認証関連もサポートしているようなので、次回以降は以下の作業もやってみます。
- 認証をしてみる(参考: WP REST API のドキュメントの認証ページの翻訳)
- まず Basic 認証を
- 次に OAuth 認証を
Paw から Contact Form 7 にポストする
こちら、REST とは関係ないのですが手始めにやってみたいと思います。
アプリを開くと、URL を入れたり詳細を設定するためのまさに GUI というのが出ます。さっそくやってみました。
入力して実行してみると、メールがちゃんと届きました。
Multipart ではなくて、Text 欄に自分でエンコードしたものを入れてもメールが送られました。
フォームに対して何かを送信する、というのはこういうことなんですね、なるほどー、ということがわかります。
ものすごく余談ですが僕はインターネット上で動く何かを作るということを始めたのは2008年の頃で、その時 html と WordPress を同時に始めて、サーバはロリポップでテーマとプラグインを入れて動かしてみるという始め方でした。ですので、
- WordPress というソフトウェアに全部任せるし操作は GUI
- POST とか GET とか分からない
- 裏で何が起こっているのかわからない
- その後勉強して色々できるようになっても、HEADER とか知らないし、知らなくてもうまくいってた
という状態でして、HTTP通信、サーバなどをすっ飛ばして、HTML のコーディングもすっ飛ばして低いレイヤーから積み上げられてきた一番上に WordPress が乗っかっていて、そこにヘリコプターで着陸して山の上から下の方で何が起こっているのかを勉強していく、という形でやってきました。
今こうして見えているレイヤーのことは気にしたことがありませんでした。これもいろんなものの上に乗っかっていているのだろうけど、だんだん基盤の方に向かっている感じがして面白いですね。
僕と同じ場所にいる方は、
- フォームデータの送信 — ごく簡単なHTMLの説明
- [Web] HTTPリクエストの中身を学んでみた。GETやPOSTの違いなど – YoheiM .NET
- Hypertext Transfer Protocol – Wikipedia
- HTTP(Hyper Text Transfer Protocol)の基礎
などを読むとふむふむ、と思えると思います。では、いよいよ REST API に色々送ってみたいと思います。
/wp-json に GET してみる
ローカルにインストールした WP REST API が有効な WordPress の /wp-json/ に対して GET のリクエストを送信したところ、右側に感動的に分かりやすい形でレスポンスが表示されました。用語集(翻訳)に出てきた Root, Route, Endpoint などがツリーの構造で見ることができて理解が深まります。
この部分は今後何度も見ることになる場所だと思うので、じっくり見ておくと色々と発見があると思います。
リソースを取得してみる
リソースとは、WordPress 内の discrete entity のことです。Posts, Pages, Comments, Users, Terms などのことで、あなたもすでに知っているものです。
ということで、 Posts, Pages, Comments, Users, Terms などのリソースを馬鹿正直に取得してみたいと思います。
GET でアクセスするだけですので、公式ドキュメントサイトのAPI Reference を見ながらリクエストをどんどん送ります。
投稿の一覧を取得
投稿の一覧を取得してみますが、その前に、WordPress が空っぽになっておりますので、サンプルのデータを入れておきます。
$ wp plugin install wordpress-importer --activate $ curl -O https://wpcom-themes.svn.automattic.com/demo/theme-unit-test-data.xml $ wp import ./theme-unit-test-data.xml --authors=create $ rm theme-unit-test-data.xml
としてやって、テーマユニットテストデータを入れておき、次に、http://wp-api.dev/wp-json/wp/v2/posts
にアクセスしてみます。ブラウザ、httpie、Paw で様子を見てみます。
なにか作ろうと思ったら Paw みたいなツールがあるとないとでは差が大きいですね。素晴らしい。
リファレンスの下の方に Arguments があり、per_page, page などをパラメータとして指定できるようなので 20ページごとにページ送りする設定で 2ページ目を取得してみました。URL Parameters として渡します。
WP_Query と似たような名前だけど少し違う、という感じでした。内部的には WP_Query と同じクラスが仕事をしているのかどうかなど、興味は尽きないですが、今は先に進もうと思います。
ポストメタを取得しようとして失敗する
投稿のメタデータは /wp-json/wp/v2/posts/<parent_id>/meta
宛に送るとドキュメントにありますのでやってみます。
401 Unauthorizedということで権限不足と言われてしまいました。
“wp rest api post meta 401 unauthorized”と検索して出てきた WordPress › Support » Custom meta data によると、
Due to security/privacy concerns, custom meta is now only available to authenticated users. You’ll need to authenticate as a user, then pass
?context=edit
with the request.セキュリティとプライバシー上の懸念から、カスタムメタは現状、認証されたユーザーのみに利用可能となっています。ユーザーとして認証を行い、
?context=edit
をリクエストに追記する必要があります。
とのことでした。認証する/しないによって返ってくるデータが違うということですね。この回避方法として上記のリンクには、/post/<id>
からのレスポンスにメタデータを含めるためのサンプルコードも載っていました。
<?php add_filter( 'json_prepare_post', function ($data, $post, $context) { $data['myextradata'] = array( 'somekey' => get_post_meta( $post['ID'], 'abcdef', true ), ); return $data; }, 10, 3 );
json_prepare_post
というフィルターが用意されているのですね。この辺りは通常のプラグインを作る時と同じ作法で操作ができるということで楽しいところです。
さて次に、投稿のリストではなく、1つの投稿のデータを返してもらうには /wp-json/wp/v2/posts/1178/
にアクセスして取得することができました。次に、その記事が所属するカテゴリを見たかったのですが、ドキュメントサイトにある /wp-json/wp/v2/posts/1178/terms/category
へのアクセスは Not Found
となります。なぜ?
調べてみるとドキュメントが間違っていて、正しくは wp-json/wp/v2/posts/1178/categories
とでした。
正しいアクセス先を調べるには、 /posts/<post-id>
にアクセスした結果の json 内で、Root->_links->https://api.w.org/term->{index}->href
という部分を見みます。_links
というのはそういう感じで、関連のアクセス先や親(個別記事を見ているときにはリストはこの URL でとれるよ、など)を教えてくれる場所なのですね。便利。
タクソノミやタームを取得してみる
次に、ドキュメントに従い、/wp-json/wp/v2/taxonomies
へアクセスすると、現在閲覧中の WordPress 内で定義されているタクソノミが表示されました。
カテゴリとタグのみが表示されているので、メニューなどの public でないタクソノミはデフォルトでは返らない、ということなのだろうと思います。(全体的に、外部から利用してもらいたいデータは返しつつ、内部の定義っぽいものは返さないのがデフォルトになっているようです。取得したデータを利用はしやすいけど、WordPress 自体の設定などに触れたい場合には認証を通りましょうね、ということですね。)
さて、ここでも _links
が便利で、次にどこを見ればよいのかがわかります。というわけで次は、/wp-json/wp/v2/categories
へ。
カテゴリのタームのリストの取得は /wp-json/wp/v2/categories
でした。デフォルトでは10個しか取得できません。 per_page
を -1
にしてみたら受け付けないみたいで、 0
にしたら全部取れました。
上記の末尾にカテゴリのterm IDを加えて、 /wp-json/wp/v2/categories/6
などとすると以下のようにカテゴリのタームが取得できます。
ユーザーを取得する
だいぶ慣れてきました。 /wp-json/wp/v2/users/
がユーザーの一覧の取得で、 /wp-json/wp/v2/users/<user_id>
が個別のユーザーの情報の取得でした。
感想
取得するだけであれば、割りと平易にもらうことができることが分かりました。取得したデータを加工して表示するのはまた別途頑張らないとですが、
- php であれば
wp_remote_get( ここにリクエストURL )
で取得して表示 - javascript であればそれぞれのフレームワークの仕様にのっとって取得 → 表示
ということになりそうです。php でなくても取得できるので、本当に便利になるしいろんな言語で基本的にはすべての WordPress のサイトの情報が取得できて表示ができるということで素晴らしいですね。
ここまでの知識でできそうなこととしては、
- お気に入りのサイトをいくつか登録しておき、定期的に記事を取りに行き、オリジナルのフィードを作って楽しむ
みたいなことでしょうか。でも、これって今までの状態でもRSS を利用すればできるわけで、もっと頑張ってみないと使いドコロがない感じという気もしますね。
というわけで、次回は「REST API をマスターするってどういうこと?何がお得なの?」というテーマで一本記事を書きまして、その後認証や WordPress とのもっと深いやりとりに進みたいと思います。
お疲れ様でした。
コメント
コメント一覧 (4件)
https://github.com/WP-API/docs-v2/
ここでドキュメントのソースがあるみたいですので、プルリクを投げられるといいかもですー
[…] アプリ: Paw アプリの利用方法 […]
ありがとうございます!やってみます!(時間のあるときに。。。w
[…] ト[1, 2]ですが、このPawがMac App Storeから撤退すると発表しています。 […]