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

シェアする

WordPress の REST API を使用して WordPress Popular Posts のデータを取得する為に1つコードを書いてみたのでメモしておく。

REST API 自体は以下の記事に簡単にではあるが使い方など書いた。

Wordpress 4.7 に REST API が入っていたので使ってみた
Wordpress のデータを json 形式で取得する方法は無いかと調べていたら、Wordpress 4.7 からは REST API が Core に組み込まれてい...

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' );

この辺の詳細については以下のドキュメントを参考にしてほしい。

で、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

シェアする

フォローする