先日、参加してきた 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['/menus'] = array( array( array( $this, 'get_nav_menus'), WP_JSON_Server::READABLE ), ); $routes['/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 ライフを!