WordPress JSON REST API に独自の endpoint を追加する

先日、参加してきた WordCamp San Francisco 2014 でも話題になってた WP JSON REST API に独自の endpoint を追加する方法です。
# WordCamp San Francisco とか WordCamp Kansai とかのイベントにも参加してるんですけど、ブログ書いてないすいません

まず WP REST API とは、なんぞやって話ですが
これは、WordPress Ver.4.1 もしくはそれ以降のバージョンで本体に組み込まれる予定の機能です。
現在はプラグインとして提供されていますので、これをインストールすることで利用できるようになります。
WordPress › JSON REST API (WP API) « WordPress Plugins
この API を使うことで、WordPress に関するありとあらゆる操作が REST API 化され、結果が JSON で返ってきます。
例えば、この投稿に関する情報は以下の URL から取得できます。
https://dogmap.jp/wp-json/posts/3136

この API に対して独自の endpoint を追加する方法について解説します。
詳しいことは、以下の URL を参照してください。
Extending the API – WP REST API Documentation

まずは、サンプルソースを提示します。
これは /wp-json/menus でカスタムメニューの一覧を /wp-json/menus/{id} で、メニューの term id を指定して生成される html ( wp_get_nav_menu_items() の実行結果 ) を返すことができるようになります。

<?php
add_action( 'wp_json_server_before_serve', function() {
	$custom_rest_api = new Custom_REST_API();
	add_filter( 'json_endpoints', array( $custom_rest_api, 'register_routes' ) );
});

class Custom_REST_API {
	public function register_routes( $routes ) {
		// menus
		$routes&#91;'/menus'&#93; = array(
			array( array( $this, 'get_nav_menus'), WP_JSON_Server::READABLE ),
		);
		$routes&#91;'/menus/(?P<menu_id>\d+)'] = array(
			array( array( $this, 'get_nav_menu_items'), WP_JSON_Server::READABLE ),
		);

		return $routes;
	}

	public function get_nav_menus( $_headers ) {
		global $wpdb;
		$sql = $wpdb->prepare(
			"SELECT t.term_id as ID, t.name, t.slug
			 FROM {$wpdb->term_taxonomy} tt
			 INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id
			 WHERE tt.taxonomy = %s",
			 'nav_menu');
		$menus = $wpdb->get_results($sql);
		return $menus;
	}

	public function get_nav_menu_items( $menu_id, $_headers ) {
		$menu = wp_get_nav_menu_object($menu_id);
		$menu_items = 
			( $menu && ! is_wp_error($menu) )
			? wp_get_nav_menu_items( $menu->term_id, array( 'update_post_term_cache' => false ) )
			: array();
		return $menu_items;
	}
}

まずは、wp_json_server_before_serve アクションフック内で json_endpoints フィルターフックを使用して endpoint を追加します。( 2-5行目 )

endpoint を追加するには json_endpoints フィルターフックで受け取る $routes に連想配列のキーとしてパスの正規表現、コールバック関数を登録します。( 8-18 行目 )

正規表現内に名前付きキャプチャを設定しておくと、それに合致した値がコールバック関数に渡されます。
例えば13行目で '/menus/(?P<menu_id>\d+)' と記述されていますが (?P<menu_id>\d+) に合致する値が、コールバック関数 array( $this, 'get_nav_menu_items')$menu_id として渡されます。
また、このほかにもコールバック関数内では以下の値が引数として渡されます。

  • _method: The requested HTTP method (GET, HEAD, POST, PUT, DELETE)
  • _route: The route followed to your endpoint (/posts/(?P\d+))
  • _path: The actual path that matches your route (/posts/1)
  • _headers: An associative array of header names to values. Names are always uppercased (HTTP header names are case-insensitive)
  • _files: An associative array of upload file data, in the same format as $_FILES

これらも、それぞれ $_method, $_route などとして、コールバック関数で受け取ることが可能です。

以上、ざっくりですがこんな感じ。

それでは、よい WordPress JSON REST API ライフを!

コメントを残す

メールアドレスが公開されることはありません。