WordPress の REST API を使用して WordPress Popular Posts のデータを取得する為に1つコードを書いてみたのでメモしておく。
REST API 自体は以下の記事に簡単にではあるが使い方など書いた。
WordPress 4.7 に REST API が入っていたので使ってみた | Lonely Mobiler
REST API へエンドポイントを追加するには以下のような感じに rest_api_init アクションフックを利用し、register_rest_route メソッドを呼び出して URL と実行するメソッドを指定する。
class WPP_REST_Controller {
public function __construct() {
$this->namespace = '/wpp';
$this->resource_name = '/posts';
}
public function register_routes() {
register_rest_route( $this->namespace , $this->resource_name, array(
'methods' => 'GET',
'callback' => array($this, 'get_wpp'),
) );
}
public function get_wpp( $request ) {
}
}
function prefix_register_wpp_routes() {
$controller = new WPP_REST_Controller();
$controller->register_routes();
}
add_action( 'rest_api_init', 'prefix_register_wpp_routes' );
この辺の詳細については以下のドキュメントを参考にしてほしい。
https://developer.wordpress.org/rest-api/extending-the-rest-api/controller-classes/
で、get_wpp メソッドの中身なのだが・・・ この中で WordPress Popular Posts のデータを取得して get_posts を呼び出し、 rest_ensure_response で JSON を出力しようとしたのだが、本来の REST API の出力と同じようにならない為、/wp/v2/posts へリダイレクトする事にした。
class WPP_REST_Controller {
public function __construct() {
$this->namespace = '/wpp';
$this->resource_name = '/posts';
}
public function register_routes() {
register_rest_route( $this->namespace , $this->resource_name, array(
'methods' => 'GET',
'callback' => array($this, 'get_wpp'),
) );
}
public function get_wpp( $request ) {
if (function_exists('wpp_get_mostpopular')) {
$args = array(
'limit' => 10,
'stats_views' => 0,
'wpp_start' => '{',
'wpp_end' => '}',
'post_html' => '{pid},',
);
ob_start();
wpp_get_mostpopular( $args );
$str = ob_get_contents();
ob_end_clean();
$str = str_replace("\n", '', $str);
preg_match('/\{(([0-9]*,)*)\}/s', $str, $match);
if (count($match)) {
$ids = rtrim($match[1], ',');
$url = get_bloginfo('url') . '/wp-json/wp/v2/posts?include=' . $ids;
header("Location: " . $url);
exit;
}
}
}
}
function prefix_register_my_rest_routes() {
$controller = new WPP_REST_Controller();
$controller->register_routes();
}
add_action( 'rest_api_init', 'prefix_register_my_rest_routes' );
WordPress Popular Posts のデータを取得するには wpp_get_mostpopular を利用する必要があるのだが、このメソッド内で HTML を出力するようなので出力バッファを制御、加工する事で人気記事の ID を取得している。
取得した人気記事の ID を用いて REST API へアクセスする URL を組み立て、リダイレクトしている。
上記のコードを functions.php などに記述しておけば
http://example.com/wp-json/wpp/posts
へアクセスした際に
http://example.com/wp-json/wp/v2/posts?include=485,682,651,735,274,694,524,501,284,658
へリダイレクトするようになる。
とりあえずこんな感じで人気記事を REST API で取得できた。
が、あとからソースコードを見直していたら WP_REST_Posts_Controller を継承して get_items メソッド呼び出せばリダイレクトする必要無いのでは・・・という気がしてきた。とりあえずこれはこれで置いておこう。
コメント