開発したアプリなど一覧

WordPress Popular Posts の人気記事を REST API で取得する

記事内にアフィリエイトリンクを含む場合があります

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 メソッド呼び出せばリダイレクトする必要無いのでは・・・という気がしてきた。とりあえずこれはこれで置いておこう。

Sponsored Link

コメント

タイトルとURLをコピーしました