WordPressの投稿データをJSON形式で外部アプリに渡す

WordPressの投稿データをJSON形式で外部アプリに渡す

手持ちの iPhone4 (32G)の空き容量が0.1Gを切りました。アプリのアップデートすらできません!週末に整理します…。そんな kagata ですこんにちは。

さて本日は、 WordPress の投稿データを外部アプリに利用させる方法をご紹介します。いくつかの方法が考えられますが、今回はいろんな場面で使える方法として JSON 形式による投稿データの出力を取り上げます。なお、このアイディアはわたしが考え出したものではなく Latin 先輩に教わったものです。ありがとうございます!

復習:基本的な WordPress ループ

シンプルな例として、投稿のタイトルと本文のみを出力する方法を考えます。ふつうにブラウザへHTMLで出力するなら、次のようなコードをテンプレートに書きますね。

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>
        <h1><?php the_title(); ?></h1>
        <?php the_content(); ?>
    <?php endwhile; >
<?php endif; ?>

この HTML 出力を、 JSON 形式に置き換えてみましょう。

JSON形式で投稿データを出力するテンプレートコード

次のコードを、 index テンプレートあたりに貼りつけてみましょう。基本的にはこれだけで、上の WordPress ループで得られたのと同じ投稿データを JSON 形式で出力することができます。

if (have_posts()) {
    $records = array();
    while (have_posts()) {
        the_post();
        $records[] = array(
            'title'   => get_the_title(),
            'content' => apply_filters('the_content', get_the_content())
        );
    }
    echo json_encode($records);
}

if や while の現れ方を上の WordPress ループと見比べてみると、基本的な構造はふつうの WordPress ループと変わらないことがわかるかと思います。

通常の WordPress テンプレートでは the_ で始まるテンプレート関数( the_title() や the_content() )で出力していたものを、 get_the_ で始まる関数( get_the_title() や get_the_content() )に置き換えるというのが基本的な考え方です。あるいは、 WP_Posts オブジェクト(グローバル変数 $post )を参照するのもよいでしょう。これらを使えば、タイトルと本文以外のデータもたいてい取得できます。

なお、関数の置き換えによって出力される結果が少し違ってくる場合があります。例えば、通常 the_content() で投稿本文を出力すると段落に p タグが補完されますが、 get_the_content() ではこの補完が効きません。これは p タグの補完処理が実行される the_content フィルターフックを get_the_content() が通過していないためです。 apply_filter() で the_content フィルターフックを通してやれば、 p タグを補完した本文データが取得できます。

// $content には p タグを補完した本文データが格納される
$content = apply_filters('the_content', get_the_content());

そのほか、プラグインの処理が効いていないなど期待したデータが得られない場合には、必要なフィルターフックを通過しているか確認してみましょう。

JSON データを外部 PHP アプリ側で受け取る

JSON 出力ができるようになったら、今度は受け取り側です。例えば PHP なら、次の要領でデータを取得します。

$records = json_decode(@file_get_contents('http://example.com/wordpress/'));

file_get_contents() で、 WordPress の所望の URL をたたいてデータを取りに行くだけです。シンプルですね。 "@" でエラーを抑制しているのは、指定した URL にアクセスできなかった場合にエラーを出さず単に空データが作成されるようにするためです。このあたりはお好みで。

$records の中身は次のとおりです。

array(10) {
  [0]=>
  object(stdClass)#1 (2) {
    ["title"]=>
    string(12) "Hello world!"
    ["content"]=>
    string(134) "

WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください !

" } [1]=> object(stdClass)#2 (2) { ["title"]=> string(12) "Hello world!" ["content"]=> string(134) "

WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください !

" } (後略)

データがちゃんと取得できているのがわかります。

あとは、 WordPress 側のテンプレートを一式作成して、受け取り側でリクエスト URL を随時変更してやれば、月別アーカイブでもカテゴリアーカイブでも個別投稿でも検索結果でも、ご所望のデータをご所望の絞り込み条件で取得できるようになります。外部アプリ側も、言語は PHP に限らず HTTP でデータを取得できて JSON を扱えるものなら何でも OK です。便利ですね!

補足:上記以外の方法

今回ご紹介した方法以外にも、 WordPress の投稿データを外部アプリから利用するには次のような方法があります。

WordPress コアをインクルードする

PHP アプリなら、 WordPress コアの wp-blog-header.php をインクルードして連携するというのが有力な手段の一つになります。データを取得するだけでなく、テンプレート関数なども外部アプリで直接使えるようになってとても便利です。

ただし、 連携させる外部アプリは PHP で開発し、 WordPress と同じサーバ上に設置する必要があります。また、 PHP で開発されたアプリでも、関数定義の重複などによりうまく連携できない場合があります。 CakePHP とかね!!

WordPress の JSON REST API を利用する

将来の WordPress コアへの機能追加に向けて、 JSON REST API プラグインの開発がすすめられています。将来、この API が WordPress コアに正式導入されれば、今回作ったような JSON 出力テンプレートの価値もなくなってしまうことでしょう orz

ただ、現状ではまだβ版ということで、プラグインページにも次のような注意書きが。

Please do not rely on any part of the plugin in production environments until the project has become part of core, as it is liable to change significantly.

ご利用の際には要注意です。正式リリースが待ち遠しいですね。

WordPress のデータベースを直接読む

これはまあ最終手段ということで…。

まとめ

  • WordPress の投稿データを外部アプリから利用させるなら、 JSON 形式で出力するテンプレートを作ってみよう。外部アプリの言語を問わず便利。
  • 出力データがなんか期待と違うな…と思ったらフィルターフックを確認しよう。通過していないフィルターがあったら、 apply_filters() で適用。
  • この記事で紹介した内容は近い将来無意味になります。たぶん。
  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ