WP Rest API にカスタムエンドポイントを作成する

わたし WordBench 埼玉という WordPress 地域コミュニティの埼玉版にて2015年からモデレータをさせていただいています。先日の19日に WP Rest API を題材に大宮の コワーキングスペース7F で WP Rest API に関して皆で学ぶ会を開かせて頂きました。
その中で疑問として挙がった ‘カスタムエンドポイントはどうやって作るんだろう?’ というのをその場でもくもくと検証しましてやり方が判明しましたのでお知らせしたいと思います。

そんなわけで、早速カスタムエンドポイントを作ってみたいと思います。わかりやすくするためにサンプルの値はスタティックに Hello World を作ってみたいと思います。
2.x系はまだベータなので1.x系でテストしています。基本公式のドキュメント に書いてあるまんまですが、functions.php かその辺りに以下のコードを書きます。

[php]
function myplugin_api_init() {
global $myplugin_api_mytype;

$myplugin_api_mytype = new MyPlugin_API_MyType();
add_filter( ‘json_endpoints’, array( $myplugin_api_mytype, ‘register_routes’ ) );
}
add_action( ‘wp_json_server_before_serve’, ‘myplugin_api_init’ );

class MyPlugin_API_MyType {

public function register_routes( $routes ) {
$routes[‘/hello’] = array(
array( array( $this, ‘hello_world’), WP_JSON_Server::READABLE )
);

return $routes;
}

public function hello_world($name = ‘World’) {
return array(‘val’=> ‘Hello ‘ . $name);
}

}
[/php]

見たまんまですが myplugin_api_init でアクションフィルター設定して、実態は MyPlugin_API_MyType に書きます。/wp-json/hello を叩くと

[code lang=text]
{"val":"Hello World"}
[/code]

が帰ってきます。パラメータに name を用意しまして、/wp-json/hellp?name=Yutaro とすると

[code lang=text]
{"val":"Hello Yutaro"}
[/code]

と帰ってきます。あとは hello_world メソッドでよしなに投稿情報などを取得して加工して返してやればいい感じの API になるわけですね。
実際に使うには本体のほうでどんなエスケープしているかなど確認が必要なのでもう少し手間がかかると思います。
また未確認ですが $routes が被った場合上書きしてしまうのではないかと思いますので判定挟んでやるとよりよいのかなと思いました。

次回の LENS ミーティングはもう少し先ですが、これで1つストックができました。