WP REST APIの基盤を使って、WordPressからJSON-LDを出力させる

WP REST APIのドキュメントを見ていたらできそうだったので覚書。

独自のエンドポイントを追加する

WP REST APIは以下の様な書き方で独自のAPIエンドポイントを追加できます。

add_action( 'rest_api_init', function () {
	register_rest_route( 'myplugin/v1', '/author/(?P\d+)', array(
		'methods' => 'GET',
		'callback' => 'my_awesome_func',
		'args' => array(
			'id' => array(
				'validate_callback' => function($param, $request, $key) {
					return is_numeric( $param );
				}
			),
		),
	) );
} );

/**
 * Grab latest post title by an author!
 *
 * @param array $data Options for the function.
 * @return string|null Post title for the latest,
 * or null if none.
 */
function my_awesome_func( $data ) {
	$posts = get_posts( array(
		'author' => $data['id'],
	) );

	if ( empty( $posts ) ) {
		return new WP_Error( 'awesome_no_author', 'Invalid author', array( 'status' => 404 ) );
	}

	return $posts[0]->post_title;
}

From:Adding Custom Endpoints | WP REST API v2 Documentation

WP_REST_Responseでヘッダーやステータスを変更する

「my_awesome_func」の方でレスポンスを用意するわけですが、「WP_REST_Response」というクラスを利用することでHTTPステータスやリクエストヘッダーを変更することができます。

function my_awesome_func( $data ) {
	$posts = get_posts( array(
		'author' => $data['id'],
	) );

	if ( empty( $posts ) ) {
		return new WP_Error( 'awesome_no_author', 'Invalid author', array( 'status' => 404 ) );
	}

	$response = new WP_REST_Response( $posts[0]->post_title );
	$response->set_status( 201 );

	return $response;
}

配列をそのままreturnするのではなく、WP_REST_Responseクラスの中に入れてオブジェクトごとreturnさせます。
上のコードであれば、HTTPステータスが201で返ります。

JSON-LDを返す

で、$response->header();という処理を使えばレスポンスヘッダーを弄れるので、Content-typeをJSON-LDにしてJSON-LDを返すようにしましょう。

 function my_awesome_func( WP_REST_Request $request ) {
 	// You can get the combined, merged set of parameters:
 	$parameters = $request->get_params();

	$data = array(
		'@context' => 'http://schema.org',
		'@type' => 'LocalBusiness',
		'name' => 'Example Store',
		'description' => 'Example store description',
		'telephone' => '000-000-0000'
	);

	// Create the response object
	$response = new WP_REST_Response( $data );

	// Add a custom header
	$response->header( 'Content-type', 'application/ld+json' );
	return $response;
 }

実行結果

wp-json_jsonld_v1_store_1
ちゃんとJSON-LDとして返ってきています。

あとはWP_REST_Responseに入れる値をWPから動的に取り出せるようにすれば、WordPressからJSON-LDを出力することができるかなと思います。

おまけ:GeoJSONなど

GeoJSONを返したくなった場合はこうすればOKです。

# GeoJSON
$response->header( 'Content-type', 'application/vnd.geo+json' );

Content-typeさえわかれば何にでも変えれそうですが、データ自体はJSON形式で出力されるのでTurtleやXMLで返すのはもう一手間必要or無理っぽいです。

Follow me!

Okamoto Hidetaka
デジタルキューブのインフラエンジニア。勉強会に和太鼓の練習から直行することが多く「太鼓の人」とかよばれてます。 思いつきで公式ディレクトリにテーマやプラグインをアップしたりテーマレビューやったりしています。 AWS / WordPress / LinkedOpenData周りで活動していて、APIをどうこうして何か作るというのが多いです。 ひとこと
mautic is open source marketing automation