WordPressで提供する Web API #wacja2012

鳥山(@sysbird)です、
WordPress Advent Calendar 2012 6日目のブログになります。Adventとは、キリスト降誕を待ち望む期間のことという。その期間、お菓子が隠された小窓を毎日ひとつづつ開けて楽しむのがAdvent Calendarだ。

お菓子にちなんで、本日はお菓子の虜 Web APIの作り方を紹介したい。「お菓子の虜」は、私がコンビニで買って食べたお菓子を記録するブログだ。いままでに食べたお菓子は2134種類。このデータを眠らせるわけにはいくまいと、Web APIとして提供することにした。毎日ただお菓子を食べているだけでないことを、証明するためでもあった。


advent

Web APIはWebサービスのデータを提供したり、Webサービスと連携させたりするためのインタフェースである。Google Maps APIやTwitter APIなど、すでにWordPress上で利用しているユーザも少なくないだろう。今回は、WordPressからWeb APIを提供してみよう。

1.WordPressでWeb API

ブログ「お菓子の虜」は WordPressで運用している。
お菓子ひとつにつき、
・タイトル(お菓子の名前)
・本文(食べた感想)
・更新日
・カテゴリ(スナック、チョコ、クッキー、飴、せんべい)
・タグ(激辛、カレー、ポテトチップ、地域限定など)
・カスタムフィールド(価格、メーカ名、ふりがな)
・添付ファイル(お菓子の写真)
というデータを持っている。

これらのデータをWordPressの外部から取得する方法がある。
WordPressのルートディレクトリにある、wp-load.phpを利用するのだ。このファイルを読み込むことで、WordPressのフロントエンドを介さずして投稿データを取得することができるようになる。
たとえば、
http://example.com
というURLでWordPressを運用している場合に、
http://example.com/api/
というリクエストURLでデータを提供することにしよう。
この場合は、WordPressがインストールされているディレクトリ直下にapiというディレクトリを作成してindex.phpを用意する。
そのなかでまず、

と、wp-load.phpのパスを指定して読み込むようにする。設置ディレクトリはここに限らず、wp-load.phpをrequire 可能な位置であればよいだろう。これだけで、WordPressの機能を利用することができる。
あとはおなじみのループ処理で投稿を取得すればよいのだ。

こうすると最新5件の投稿が取得されるので、決まったフォーマットで出力していけばよい。

2.XMLを生成

Web APIを提供する場合のデータ形式として、代表的なものにXML形式がある。XMLを生成するには、WordPressから取得した投稿をもとにDOM構造を作っていく。

まず”okashinotoriko”というルートの要素を作成している。要素名はなんでもよい。次に、さきほどのループの中で1件の投稿をひとつの子要素として追加していく。

okashinotorikoというルート要素の中に、複数のitemという要素から成るDOM構造ができる。ここでは例として主な要素のみ追加しているが、このほかにもカテゴリやタグ、更新日など投稿に関するデータを好きな要素として追加してよい。
アイキャッチは、WordPressのget_the_post_thumbnail()ではimgタグごと取得されてしまうため、正規表現でsrc属性のみ取り出す。

生成されたDOMをXMLドキュメントとして出力すれば、Web APIとして利用可能となる。

» サンプルレスポンス

3.検索パラメータに対応

Web APIらしくするには、検索パラメータが必要だろう。
たとえば、
”hoge”というキーワードで30件のデータを取得したい場合は、リクエストURLにパラメータをつなげていく。
http://example.com/api/?keyword=hoge&max=30

この場合、URLのパラメータをPHPの$_GET変数で取得し、get_posts()に渡すパラメータに項目を追加していけばよい。

このようにリクエストURLのパラメータを増やしていくことで、WordPressのループ条件を設定する。ほかにもカテゴリ、年月、開始位置、取得順など、get_posts()に指定できるものが利用できるので、いろいろやっているうちにWeb APIっぽくなる。

» キーワード”カレー”、取得件数10で検索した場合のサンプルレスポンス

4.JSONで出力

Web APIであるからには、JavaScriprからも利用可能なJSON形式にも対応したい。PHPのjson_encode()という関数で変換して出力する。

ajaxでcallbackの使えるJSONP形式にしておく。
JSON形式があると、静的ページでもJavaScriptを使ってWordPressの投稿データを表示できるようになるので、利用シーンがぐっと広がる。

» キーワード”カレー”、取得件数10、JSON形式で検索した場合のサンプルレスポンス

まとめ

ごく簡単なREST形式のWeb APIを作例として紹介したものの、リクエストパラメータをPOST変数にしたり、認証を加えたりと、改善の余地はあろう。WordPress同士でも、それ以外のシステムとのやりとりでも、ちょっとしたデータを提供できるとなにかと便利だ。ぜひ試してほしい。

WordPress Advent Calendar 2012 は、まだまだ続きます!
昨日は、
» WordPressのインストールって何? #wacja2012 井村さん
» マルチサイト構築時、油断してて大量のスパムにやられた!一番の脆弱性は自分って話 #wacja2012 #wacja2012 Kさん
のお二人でした。

advent明日はgrandpawhiteOSAさんです、
おたのしみに!

3件のコメント

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください