WP APIで_embedと_fieldsをくみあわせるときは、_linksを使う
以前に_fieldsクエリと組み合わせて、WP APIレスポンスを最小限に抑える方法を紹介した。今回は、_embedクエリを使って情報をフィルターする方法について説明した。_embedクエリを使用すると、関連情報も取得できるが、特定の情報を抽出したい場合は_fieldsで指定が必要。_embedと_fieldsを組み合わせる際は、書き方に注意が必要。サンプルでは、authorの情報を埋め込みつつ、取得内容を絞っている。
目次
以前_fieldsクエリを使って、WP APIのレスポンスを必要最低限にする方法を紹介しました。今回はその続編で、_embedクエリで取得できる情報についてもフィルターする方法を紹介します。
_embedクエリを使って、関連情報を取得する
WP APIで取得できる情報は、原則として「そのリソースPostTypeのデータ」だけです。postを呼び出した場合は、投稿(post_type=post)だけですし、固定ページ(post_type=page)も同様です。しかしユースケースによっては、そのリソースに関連する情報もまとめて取得したいケースがあります。「記事を書いた人」や「サムネイル画像」などがよく耳にするユースケースですね。
これらの情報についてもまとめて取得できるようにするのが、_embedクエリです。このクエリを追加することで、postに対するAPIリクエストで、authorの情報なども取得することができます。
_embedと_fieldsをくみあわせるときは、_linksを使う
_embedを使いつつ、_fieldsでレスポンスの中身を選別したい場合、すこし書き方に工夫が要ります。それは「_fieldsで指定するフィールドに_links.<リソース名>も一緒に指定する」やり方です。下のサンプルでは、authorの情報を_embedで取得しつつ、_fieldsを利用して取得内容を絞り込んでいます。
curl "https://example.com/wp-json/wp/v2/posts?&_embed=author&_fields=_links.author,_embedded,title,link,date_gmt" | jq ".[0]"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 19163 0 19163 0 0 274k 0 --:--:-- --:--:-- --:--:-- 292k
{
"date_gmt": "2023-12-30T11:59:00",
"link": "https://example.com/register-rest-api-route-on-wordpress/",
"title": {
"rendered": "WordPressのREST APIエンドポイントを追加する方法"
},
"_links": {
"author": [
{
"embeddable": true,
"href": "https://example.com/wp-json/wp/v2/users/1"
}
]
},
"_embedded": {
"author": [
{
"id": 1,
"name": "Okamoto Hidetaka",
"url": "https://example.com/",
"description": =====",
"link": "https://example.com/author/admin/",
"slug": "admin",
"avatar_urls": {
"24": "https://secure.gravatar.com/avatar/xxxxx?s=24&d=mm&r=g",
"48": "https://secure.gravatar.com/avatar/xxxxx?s=48&d=mm&r=g",
"96": "https://secure.gravatar.com/avatar/xxxxx?s=96&d=mm&r=g"
},
"_links": {
"self": [
{
"href": "https://example.com/wp-json/wp/v2/users/1"
}
],
"collection": [
{
"href": "https://example.com/wp-json/wp/v2/users"
}
]
}
}
]
}
}
この場合、_fieldsで_embedded.authorと指定するのではなく、_fields=_links.author,_embeddedのように指定します。_links側でリソースを指定し、_embedded側では何も指定しないようにしています。