WP APIのレスポンス内容をPHPでカスタマイズする方法
WP APIを使ってWordPress内の記事データをREST形式のAPIリクエストで取得できます。レスポンスカスタマイズ方法として、_fieldsパラメータを使用する方法や、register_rest_field関数を使用してカスタムなデータを追加する方法が紹介されています。ただし、デフォルトで提供されているAPIのレスポンス内容を減らすことは非推奨であり、注意が必要です。カスタムフィールドの情報を含める場合には、get_post_meta関数と組み合わせることができます。また、追加したフィールドには_fieldクエリを使用して必要なデータのみを取得することもできます。
目次
WP APIを使うことで、WordPress内の記事データをREST形式のAPIリクエストで取得できます。複数のサービスを組み合わせる場合や、カスタムフィールドなどを組み合わせる場合の、レスポンスカスタマイズ方法を紹介します。
レスポンスの内容を減らしたい場合は、_fields
を先に検討する
ハンドブックでも注意喚起が行われていますが、デフォルトで提供されているAPIのレスポンス内容を減らすことは非推奨です。ブロックエディタやテーマ、プラグインなどが除去されたデータを参照している可能性があるため、変更によって管理画面などの動作がおかしくなるリスクがあります。
もし記事一覧APIのレスポンスを軽量化したい場合などでは、_fields
パラメタを利用するようにしましょう。
% curl "http://localhost:8881/wp-json/wp/v2/posts/1?_fields[]=title&_fields[]=guid" | jq .
{
"guid": {
"rendered": "http://localhost:8881/?p=1"
},
"title": {
"rendered": "Hello world!"
}
}
register_rest_field
でレスポンスにカスタムなデータを追加する
登録ずみのAPIにレスポンスを追加する場合、register_rest_field
関数を利用します。第一引数でパスを、第二引数で追加するフィールド名を追加します。第三引数でメソッドに応じたコールバック関数を指定すれば、そのフィールドにどんなデータを含めるかが指定できます。
add_action( 'rest_api_init', function () {
register_rest_field(
'post',
'test_field',
[
'get_callback' => function( $post ) {
return "test";
}
]
);
});
上のサンプルコードでは、記事系のAPIレスポンスにtest_field
フィールドが追加されます。
% curl "http://localhost:8881/wp-json/wp/v2/posts/1" | jq .test_field
"test"
コールバック関数内で、記事などの情報を取得する
コールバック関数には、投稿などのリソースに関する情報が含まれています。そのため、get_post_meta
関数などを組み合わせることで、カスタムフィールドの情報をレスポンスに含めることができます。
register_rest_field(
'post',
'test_field',
[
'get_callback' => function( $object ) {
$meta = get_post_meta( $object[ 'id' ] );
return $meta;
}
]
);
上のカスタマイズを加えると、test_field
のデータは次のように変わります。
{
"_edit_lock": [
"1703911515:1"
],
"test": [
"hello world"
],
"_edit_last": [
"1"
]
}
_field
と組み合わせて、必要なデータだけ取得する
追加したフィールドについても_field
クエリが利用できます。
% curl "http://localhost:8881/wp-json/wp/v2/posts/1?_fields=test_field" | jq .
{
"test_field": {
"_edit_lock": [
"1703911560:1"
],
"test": [
"hello world"
],
"_edit_last": [
"1"
]
}
}
「引き算は_field
足し算はregister_rest_field
」と覚えておくのがよいかもしれません。