WordPress REST API (Version 2) の posts エンドポイントにカスタムフィールドの値を追加する


WordPress REST API (Version 2) で出力される JSON でカスタムフィールドで登録した値を取得したいけど Post Meta エンドポイント (http://example.com/wp-json/wp/v2/posts/<parent_id>/meta) はセキュリティの関係上、認証[*1]されたユーザにしか出力されないので Posts エンドポイント (http://example.com/wp-json/wp/v2/posts/<id>) でカスタムフィールドの値を出力するメモ。
[*1] Authentication | WP REST API v2 Documentation

functions.php に以下を追加。
$response に出力される JSON のデータ(?)が入っているので rest_prepare_post をフックして値を書き換え。

function my_rest_prepare_post( $response, $post, $request ) {
	
	$response->data['post_meta'] = array(
		'hoge' => get_post_meta( $post->ID, 'key_hoge', true ),
		'fuga' => get_post_meta( $post->ID, 'key_fuga', true ),
	);

	return $response;
}
add_filter( 'rest_prepare_post', 'my_rest_prepare_post', 10, 3 );

フィルターフックはプラグインディレクトリ内、 rest-api/lib/endpoints/class-wp-rest-posts-controller.php で定義されており post_type 毎に設定できるので pagesエンドポイント (http://example.com/wp-json/wp/v2/pages/<id>) に追加したいのであれば rest_prepare_page と。

		/**
		 * Filter the post data for a response.
		 *
		 * The dynamic portion of the hook name, $this->post_type, refers to post_type of the post being
		 * prepared for the response.
		 *
		 * @param WP_REST_Response   $response   The response object.
		 * @param WP_Post            $post       Post object.
		 * @param WP_REST_Request    $request    Request object.
		 */
		return apply_filters( 'rest_prepare_' . $this->post_type, $response, $post, $request );

カスタマイズ方法を探していて WordPress › フォーラム » カスタムフィールドの内容をJSON REST APIで表示する を参考にしたのですがこの時は WordPress REST API (Version 1) で、 Version 2 になってフィルターフック名が変わっていたので躓いた…

参考サイト