WP APIで必要なデータだけレスポンスに含める方法
2023年2月にWordCamp Asia 2023で聞いた話をようやく試せたので、覚書です。WP APIのレスポンスは情報が豊富であり、不要な情報を絞るために_fieldsクエリパラメータを利用することができます。また、JavaScriptでAPIを利用する場合はURLSearchParamsを使用して_fieldsを指定することができます。参考記事に詳細があります。
広告ここから
広告ここまで
目次
2023年2月にWordCamp Asia 2023で聞いた話をようやく試せたので、覚書です。
WP APIのレスポンスは情報が豊富
WordPressの記事やカテゴリなどのデータを取得・操作できるWP APIは、多くの情報をレスポンスに含めます。
% curl http://localhost:8881/wp-json/wp/v2/posts/1 | jq keys
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:-100 1811 0 1811 0 0 4793 0 --:--:-- --:--:-- --:--:-- 4868
[
"_links",
"author",
"categories",
"comment_status",
"content",
"date",
"date_gmt",
"excerpt",
"featured_media",
"format",
"guid",
"id",
"link",
"meta",
"modified",
"modified_gmt",
"ping_status",
"slug",
"status",
"sticky",
"tags",
"template",
"title",
"type"
]
しかしAPIレスポンスを高速化したり、不要な情報をフロントエンドに露出させないために、レスポンスの内容を絞る必要が出てくることがあります。
_fields
を利用して任意のフィールドのみ取得する
任意のフィールドだけ取得したい場合、APIリクエストのクエリパラメータとして_fields
を渡しましょう。例えば次のリクエストでは、タイトルのみがレスポンスに含まれます。
% curl "http://localhost:8881/wp-json/wp/v2/posts/1?_fields=title" | jq .
{
"title": {
"rendered": "Hello world!"
}
}
複数のフィールドを取得する場合は、カンマ区切りでフィールド名を指定します。
% curl "http://localhost:8881/wp-json/wp/v2/posts/1?_fields=title,guid" | jq .
{
"guid": {
"rendered": "http://localhost:8881/?p=1"
},
"title": {
"rendered": "Hello world!"
}
}
もしくは_fields[]
で配列のように扱うこともできます。
% curl "http://localhost:8881/wp-json/wp/v2/posts/1?_fields[]=title&_fields[]=guid" | jq .
JavaScriptのfetch
で_fields
を指定する
JavaScriptでAPIを利用する場合、URLSearchParams
を利用して値が設定できます。
const params = new URLSearchParams('')
params.set('_fields', 'title, guid')
const result = await fetch(`http://localhost:8881/wp-json/wp/v2/posts/1?${params.toString()}`)
const response = await result.json()
return c.json(response)
配列形式を取りたい場合は、append
を利用しましょう。
const params = new URLSearchParams('')
params.append('_fields[]', 'title')
params.append('_fields[]', 'guid')
const result = await fetch(`http://localhost:8881/wp-json/wp/v2/posts/1?${params.toString()}`)
const response = await result.json()