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
側では何も指定しないようにしています。