贔屓球団が劇的なサヨナラ勝利を飾って終日ゴキゲン、渕上です。

前回の記事では「WP REST API」プラグインを利用してWordpressに登録されている記事一覧をJSONとして取得する方法をご紹介しました。
今回は、既存プラグイン等で追加される記事のメタデータを、「WP REST API」が返却するJSONに含める方法についてご紹介したいと思います。

WP-PostViews

当ブログにインストールされているプラグインで、事例として紹介しやすいものがないかと
管理画面を眺めたところ、「WP-PostViews」というのがありました。

このプラグインは「PV数」を記事のメタデータとして追加したり、
人気記事の一覧を出力したりするプラグインのようです。

WP-PostViewsを拡張するプラグインを作る

では、早速このプラグインを拡張してみたいと思います。
しかしながらプラグインのソースコードを改変するのは避けたいので、
‘wp-postviews-json-rest-api-addon’という新規プラグインを作り、
そちらにコードを書いていきたいと思います。

‘/path/to/wordpress/wp-content/plugins’に’wp-postviews-json-rest-api-addon’というディレクトリを切り、
ディレクトリに’wp-postviews-json-rest-api-addon.php’ ファイルを作ります。

APIの返却するJSONを拡張する

‘wp-postviews-json-rest-api-addon.php’ を下記のように編集します。

  1 <?php
  2 /**
  3  * @package WP PostViews JSON REST API Addon
  4  * @version 0.1
  5  */
  6 /*
  7 Plugin Name: PostViews JSON REST API Addon
  8 Plugin URI: http://www.adjust.ne.jp/
  9 Description: WP-PostViewsをWP REST API に対応させるプラグイン
 10 Author: Kazuhiro Fuchigami
 11 Version: 0.1
 12 Author URI: http://www.adjust.ne.jp/
 13 */
 14
 15 add_filter( 'json_prepare_post', function ( $data, $post, $context ) {
 16   return $data;
 17 }, 10, 3 );

WordPressに標準で用意されている関数、add_filterを使って、’json_prepare_post’フックに関数を登録します。
リファレンスにフックの一覧が見当たらないので、こちらの記事を参考にさせていただきました。

ここで第一引数になっている$dataを好きなように拡張すれば、APIの返却するJSONに新たなプロパティを追加できそうです。

PV数を追加する

JSONにプロパティを追加する方法がわかったので、「WP PostViews」によって追加された記事のメタ情報である「PV数」をJSONにも追加してみたいと思います。

とはいえ、私「WP PostViews」のことを全く知らないため、「PV数」をどのように取得すればいいのかまったくわかりません。
しばらく「WP PostViews」プラグインのソースコードを読んでみることにします。

‘wp-postviews/wp-postviews.php’ を眺めてみると、それらしいものがありました。

201 ### Function: Display The Post Views
202 function the_views($display = true, $prefix = '', $postfix = '', $always = false) {
203     $post_views = intval( get_post_meta( get_the_ID(), 'views', true ) );
204     $views_options = get_option('views_options');
205     if ($always || should_views_be_displayed($views_options)) {
206         $output = $prefix.str_replace( array( '%VIEW_COUNT%', '%VIEW_COUNT_ROUNDED%' ), array( number_format_i18n( $post_views ), postviews_round_number( $post_views) ), stripslashes( $views_options['template'] ) ).$postfix;
207         if($display) {
208             echo apply_filters('the_views', $output);
209         } else {
210             return apply_filters('the_views', $output);
211         }
212     }
213     elseif (!$display) {
214         return '';
215     }
216 }

203行目の $post_views = intval( get_post_meta( get_the_ID(), 'views', true)); がそれっぽいですね。
‘views’という名前のpost_metaにPV数が保存されているみたいです。

‘wp-postviews-json-rest-api-addon.php’ を下記のように変更しました。

 15 add_filter( 'json_prepare_post', function ( $data, $post, $context ) {
 16
 17   $data['views'] = intval( get_post_meta($post['ID'], 'views', true) );
 18
 19   return $data;
 20 }, 10, 3 );

Yet Another Related Posts Plugin

いつからか、当ブログの記事の末尾に「こんな記事も読まれています」というブロックが表示されていました。
ついでですので、この関連記事情報もJSONに含まれるようにしてみましょう。

これは「Yet Another Related Posts Plugin」というプラグインにより出力されているようです。
Wordpressのpluginsディレクトリに’yet-another-related-posts-plugin-json-rest-api-addon/yet-another-related-posts-plugin-json-rest-api-addon.php’ を作りました。
ファイルの中身は下記です。

<?php
/**
 * @package Yet Another Related Posts Plugin JSON REST API Addon 
 * @version 0.1 
 */
/*
Plugin Name:Yet Another Related Posts Plugin JSON REST API Addon 
Plugin URI: http://www.adjust.ne.jp/
Description: Yet Another Related Posts Plugin をWP REST API に対応させるプラグイン
Author: Kazuhiro Fuchigami 
Version: 0.1
Author URI: http://www.adjust.ne.jp/
*/

add_filter( 'json_prepare_post', function ( $data, $post, $context ) {
  global $yarpp;
  foreach ($yarpp->get_related($post['ID']) as $related ) {
    $data['related_posts'][] = array(
      'ID'    => $related->ID,
      'title' => $related->post_title,
    );
  } 

  return $data;
}, 10, 3 );

先ほどと同じく、’json_prepare_post’にフックする処理を追加します。

「Yet Another Related Posts Plugin」のソースを読みながら悪戦苦闘すること数十分、
global変数の$yarppに代入されているYARPPクラスのインスタンスが
関連記事取得メソッド’get_related’を持っていることがわかったので、
そのメソッドを使って関連記事(WP_Postsクラスのインスタンスたちの配列)を取得しました。
必要な情報を$dataに代入して、完了です。

動作確認してみる

折角プラグインを作りましたので、当ブログにインストールして動作確認してみます。

/wp-json/posts?filter[posts_per_page]=1にアクセスして最新の1件の記事を取得し、
プラグインで追加した’view’と’related_posts’プロパティが含まれるか確認しました。
うまく、含まれているようです。

これだけだとわかりずらいですので、
前回同様JavascriptでHTMLに出力するサンプルを作成してリンクしておきます。

サンプルを開く

感想

2回にわたって「WP REST API」についてご紹介してきました。

WordPress標準のget_post()関数と同じ感覚で記事の一覧が取得できること、
比較的簡単に拡張ができることがお分かりいただけたかと思います。

「WP REST API」では記事の取得の他にも、
記事の編集やコメント投稿なども行えるようですので、
機会があれば利用してみたいと思います。