JavaScriptWordPress

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()

参考記事

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts