習うより慣れろ。WP API にリクエストをいっぱい投げる。& REST クライアント “Paw” が超便利。

WP REST API サイトの主要なページをじっくり読んだところで、次は習うより慣れろということで、リクエストいっぱいしてみて、レスポンスをじっくり見てみよう、という趣向で進めてみたいと思います。

前提として、以下の記事を読んでおくと、話がよく分かると思います。

また作業にあたり、Mさんこと @miya0001 さんから Paw – The ultimate REST client for Mac という、REST クライアントを紹介してもらいましたので使ってみました。

スクリーンショット 2016-01-03 10.34.36

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 ができるということです。

インストールするとこんな感じで、

Paw の初期画面
Paw の初期画面
  • アクションを選び、
  • URL を入れて
  • パラメータを指定する

ための画面が出てきました。とりあえず、

というのをやってみます。

Paw では認証関連もサポートしているようなので、次回以降は以下の作業もやってみます。

  • 認証をしてみる(参考: WP REST API のドキュメントの認証ページの翻訳)
    • まず Basic 認証を
    • 次に OAuth 認証を

Paw から Contact Form 7 にポストする

こちら、REST とは関係ないのですが手始めにやってみたいと思います。

新規作成の画面。クリックで拡大
新規作成の画面。クリックで拡大

アプリを開くと、URL を入れたり詳細を設定するためのまさに GUI というのが出ます。さっそくやってみました。

body のところ、 Multipart 欄に入れてみました。httpie で & で繋いでた名前と値を分割して入れていく感じ
body のところ、 Multipart 欄に入れてみました。httpie で & で繋いでた名前と値を分割して入れていく感じ

入力して実行してみると、メールがちゃんと届きました。

Multipart ではなくて、Text 欄に自分でエンコードしたものを入れてもメールが送られました。

Multipart のところに分割していたところ、1行のテキストとして送ってもよい。
Multipart のところに分割していたところ、1行のテキストとして送ってもよい。

フォームに対して何かを送信する、というのはこういうことなんですね、なるほどー、ということがわかります。

ものすごく余談ですが僕はインターネット上で動く何かを作るということを始めたのは2008年の頃で、その時 html と WordPress を同時に始めて、サーバはロリポップでテーマとプラグインを入れて動かしてみるという始め方でした。ですので、

  • WordPress というソフトウェアに全部任せるし操作は GUI
  • POST とか GET とか分からない
  • 裏で何が起こっているのかわからない
  • その後勉強して色々できるようになっても、HEADER とか知らないし、知らなくてもうまくいってた

という状態でして、HTTP通信、サーバなどをすっ飛ばして、HTML のコーディングもすっ飛ばして低いレイヤーから積み上げられてきた一番上に WordPress が乗っかっていて、そこにヘリコプターで着陸して山の上から下の方で何が起こっているのかを勉強していく、という形でやってきました。

今こうして見えているレイヤーのことは気にしたことがありませんでした。これもいろんなものの上に乗っかっていているのだろうけど、だんだん基盤の方に向かっている感じがして面白いですね。

僕と同じ場所にいる方は、

などを読むとふむふむ、と思えると思います。では、いよいよ REST API に色々送ってみたいと思います。

/wp-json に GET してみる

json が GUI で見られるだけですごく分かりやすくなる。
json が GUI で見られるだけですごく分かりやすくなる。

ローカルにインストールした 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 を見ながらリクエストをどんどん送ります。

公式のドキュメントサイトのAPI リファレンス。右上にリクエストURLのサンプルがあるので、真似をする。
公式のドキュメントサイトのAPI リファレンス。右上にリクエストURLのサンプルがあるので、真似をする。時々間違っているので気をつける。

投稿の一覧を取得

投稿の一覧を取得してみますが、その前に、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 で様子を見てみます。

ブラウザで見た場合
ブラウザで見た場合
ターミナルから httpie で。死ぬほど長くて読めないことはないけど読みたくはない。
ターミナルから httpie で。死ぬほど長くて読めないことはないけど読みたくはない。
Paw が素敵すぎる。10件取れてて中身も綺麗に見えます。
Paw が素敵すぎる。10件取れてて中身も綺麗に見えます。

なにか作ろうと思ったら Paw みたいなツールがあるとないとでは差が大きいですね。素晴らしい。

リファレンスの下の方に Arguments があり、per_page, page などをパラメータとして指定できるようなので 20ページごとにページ送りする設定で 2ページ目を取得してみました。URL Parameters として渡します。

per_page=20 と page=2 を URL パラメータとして渡す
per_page=20 と page=2 を URL パラメータとして渡す

WP_Query と似たような名前だけど少し違う、という感じでした。内部的には WP_Query と同じクラスが仕事をしているのかどうかなど、興味は尽きないですが、今は先に進もうと思います。

ポストメタを取得しようとして失敗する

投稿のメタデータは /wp-json/wp/v2/posts/<parent_id>/meta 宛に送るとドキュメントにありますのでやってみます。

401 Unauthorized と出ました。カスタムフィールドの値はログインしてないと取れないのかな?
401 Unauthorized と出ました。カスタムフィールドの値はログインしてないと取れないのかな?

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 内で定義されているタクソノミが表示されました。

/wp-json/wp/v2/taxonomies へアクセスすると WordPress が持っているタクソノミのリストがもらえる
/wp-json/wp/v2/taxonomies へアクセスすると WordPress が持っているタクソノミのリストがもらえる

カテゴリとタグのみが表示されているので、メニューなどの public でないタクソノミはデフォルトでは返らない、ということなのだろうと思います。(全体的に、外部から利用してもらいたいデータは返しつつ、内部の定義っぽいものは返さないのがデフォルトになっているようです。取得したデータを利用はしやすいけど、WordPress 自体の設定などに触れたい場合には認証を通りましょうね、ということですね。)

さて、ここでも _links が便利で、次にどこを見ればよいのかがわかります。というわけで次は、/wp-json/wp/v2/categories へ。

/wp-json/wp/v2/categories で取得できました。10件デフォルトなのは面倒かも。
/wp-json/wp/v2/categories で取得できました。10件デフォルトなのは面倒かも。

カテゴリのタームのリストの取得は /wp-json/wp/v2/categories でした。デフォルトでは10個しか取得できません。 per_page-1 にしてみたら受け付けないみたいで、 0 にしたら全部取れました。

上記の末尾にカテゴリのterm IDを加えて、 /wp-json/wp/v2/categories/6 などとすると以下のようにカテゴリのタームが取得できます。

スクリーンショット 2016-01-03 13.01.07

ユーザーを取得する

/wp-json/wp/v2/users でユーザーの一覧
/wp-json/wp/v2/users でユーザーの一覧
/wp-json/wp/v2/users/<user_id> で個別のユーザーの情報取得
/wp-json/wp/v2/users/<user_id> で個別のユーザーの情報取得

だいぶ慣れてきました。 /wp-json/wp/v2/users/  がユーザーの一覧の取得で、 /wp-json/wp/v2/users/<user_id> が個別のユーザーの情報の取得でした。

感想

取得するだけであれば、割りと平易にもらうことができることが分かりました。取得したデータを加工して表示するのはまた別途頑張らないとですが、

  • php であれば wp_remote_get( ここにリクエストURL ) で取得して表示
  • javascript であればそれぞれのフレームワークの仕様にのっとって取得 → 表示

ということになりそうです。php でなくても取得できるので、本当に便利になるしいろんな言語で基本的にはすべての WordPress のサイトの情報が取得できて表示ができるということで素晴らしいですね。

ここまでの知識でできそうなこととしては、

  • お気に入りのサイトをいくつか登録しておき、定期的に記事を取りに行き、オリジナルのフィードを作って楽しむ

みたいなことでしょうか。でも、これって今までの状態でもRSS を利用すればできるわけで、もっと頑張ってみないと使いドコロがない感じという気もしますね。

というわけで、次回は「REST API をマスターするってどういうこと?何がお得なの?」というテーマで一本記事を書きまして、その後認証や WordPress とのもっと深いやりとりに進みたいと思います。

お疲れ様でした。

↓ プラグインを作る方々への本、書きました。 ↓

“習うより慣れろ。WP API にリクエストをいっぱい投げる。& REST クライアント “Paw” が超便利。” への 4 件のフィードバック

  1. ありがとうございます!やってみます!(時間のあるときに。。。w

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です