WordPress記事の一覧を出力する簡単なAPIを作成してみる
複数のサイト(複数のドメイン・別サーバー)を運用していて、単純に他方の記事一覧なんかを取得したい…とうことで、PHPを使ってWordPressの記事一覧をJSON(P)で出力する、簡単なWEB APIを作ってみる
WEB APIのはじめの一歩として、ちょうどいい感じじゃないだろうか。
WEB APIとは
Web APIでは、PHPやPerl(ほかの言語でもOKですが)といったプログラムが、Webサーバに対して「このデータが欲しい」と、Web APIを使った検索結果をリクエストします。この「データ」とは、例えばYahoo!の検索結果やGoogle Mapのデータだったり、郵便番号と対応する住所だったりします。
リクエストを受け取ったWebサーバ、指定されたWeb APIを使ってデータを検索したり、計算したり、加工したりして、クライアントにデータを返します。
http://www.atmarkit.co.jp/ait/articles/0703/13/news095_2.htmlより
出力は、とりあえず2種類用意する
必要になるのは、JSONの出力とJSONPの出力。
APIといえばXMLを出力するものが多いが、今回のサンプルでは扱いが簡単なJSON(P)で作成する。
JSONとJSONPの、2つの出力に対応しておいた方が汎用性が高い。
JSONPはJavaScriptのajaxを使って取得する場合専用と考えてもらっていい。
JavaScriptのajaxを使う場合は、単純に「クロスドメインで(表示しているページのドメインとは別のドメインから)のデータ取得は、(JSONではなく)JSONPでなければうまくいかない」と覚えてもらって問題ない。
例)WordPressの記事一覧を返すAPI
まず、PHPで出力する配列データを生成する。
サンプルとして、api_test.phpというファイルを作成し、WordPressの記事一覧を取得して返す処理を書いてみる。
<?php // ファイル名:api_test.php 文字コード:UTF-8 // $return_valを、最終的に出力する配列データにする $return_val = array(); // WordPressを読み込んで、WPの関数を使えるようにする require_once('wp-load.php'); //記事の一覧を取得する $posts = get_posts(); foreach($posts as $post){ $arr = array(); $arr["title"] = $post->post_title; // タイトル $arr["url"] = get_permalink($post->ID); // パーマリンク $return_val[] = $arr; }
次に出力部を書く。
jQueryでajaxを利用する場合、「callback」の値が自動で付与される。
出力をあまり意識せずに使えるように、ここでは$_GETなり$_POSTなりで「callback」を受け取った場合にはJSONPを、それ以外の場合はJSONを出力するように出力を分岐する。
//出力分岐 ---------- //「callback」を受け取った場合はJSONPを出力 if(isset($_REQUEST['callback'])){ // ヘッダー出力 header("Access-Control-Allow-Origin: *"); header( 'Content-Type: text/javascript; charset=utf-8' ); echo $_REQUEST["callback"]."(" . json_encode($return_val). ")"; //それ以外の場合はJSONを出力 }else{ header("Access-Control-Allow-Origin: *"); header( 'Content-Type: text/json; charset=utf-8' ); echo json_encode($return_val); } // exit();
このサンプルの条件分岐については、callbackに別名を指定しない事が前提。
別名を使う場合は、if文の条件を工夫する必要がある。
ちなみに、「<?php」は改行なし、タブもスペースもなしの先頭に記述して、対応する「?>」は記述しない。
<?php ~ ?>の外の部分は、改行もスペースも普通に出力処理されるので、無駄なエラーを回避する。
PHPは「?>」の記述が無い場合、ファイルが終われば一旦処理も終える。「処理される時に、ファイル末尾に自動的に「?>」が付く」ぐらいに思っておいて問題ない。
PHPでJSONを取得してみる
test_api.phpをPHPで使う場合は、取得したいところで単純にfile_get_contents関数を使うのが簡単。
URLは「http://php_api_sample.com/api_test.php」とする。
$url = 'http://php_api_sample.com/api_test.php'; $rs = file_get_contents($url); $data = json_decode($rs);
これで、複数のサイト(複数のドメイン・別サーバー)を運用している場合、単純に他方の記事一覧なんかを取得したりするのには便利に使える。
例)JQueryでJSONPを取得してみる
同じ事をJQueryをajax使ってやってみる。
サンプルとして、ページ内の<ul id="posts">に<li>要素に、タイトルとリンクを追加する。
<script> var url = 'http://php_api_sample.com/api_test.php'; $.ajax({ type: 'POST', url: url, dataType: 'jsonp', crossDomain: true, cache: false //キャッシュさせない場合指定 }) .done(function(data) { var txt = ''; if(data.length){ for (var i = 0, i < data.length; i++){ txt = txt + '<li>'; txt = txt + '<a href="' + data[i]['url'] + '">'; txt = txt + data[i]['title']; txt = txt + '</a>'; txt = txt + '</li>'; } } $('ul#posts').html(txt); }); </script>
jQuery.ajaxの記述については、次のページが参考になります。
jQuery.ajax()のまとめ: 小粋空間
WEB APIとか、WEBサービスとか
今回のサンプルで作成したものは、通常はWordPressがHTMLテキストを出力するのに対して、JSON又はJSONPテキストを出力するだけのもの。
これを果たしてWEB APIと呼んでしまうのにためらいを感じる。
ただ、test_api.phpがユーザーIDを受け取ったり、受け取った値を使ってデータベースからレコードを抽出したり、レコードを追加したり…といった処理を行えば、WEB APIと呼んでしまっている。
この程度のものを他の人に提供した時には、「WEBサービス」と呼ばれていた。
調べていると、「WEBサービス」が広義で「WEB API」の方が狭義だったりするみたい。
正直、一人でやっているぶんには、どっちでも…いいや…。
