WP REST APIを使用するときに、今まではリクエストURLにパラメーターを書いてました。

こんな感じで。

//localhost/wp-json/wp-/v2/posts/?per_page=10&_embed

ただ、上記だとあまりにも流用性に欠けるので、
パラメーターの部分にURLSearchParamsを使用することにしました。

ですが、_embedを指定しているにも関わらず_embeddedが取得されませんでした。

おそらくこの状況になっている方は、
パラメーターに_fieldsを指定しているのではないかと思われます。

そして、_fieldsの値はおそらくこんな状況かと。。。

title, excerpt, link, _embedded

そうなんです。これだと_embeddedが取得されません。

もちろん上記以外の状況で取得できていない場合もありますが、
そういった方でも参考になるかもしれませんので、ぜひご参考に。

# この記事で解決できること

WP REST APIのパラメーター設定時にURLSearchParamsを使用した際、
_embeddedのkeyがjsonに含まれない現象を解決できます。

前提

今回はaxiosを使用しますが、
リクエストの根本は同じですのでfetchでもなんでもござれです。

WP REST APIの仕様上、asyncawaitを使用していますので、コンパイルは必要です。

成功するコード例

成功するコード例は下記のとおりです。

成功するためのポイントは、8, 18, 19行目です。

失敗するコード: js

import axios from 'axios'

const fetchClient = axios.create({
  baseURL: `//localhost/wp-json/wp/v2/`,
})

const fetchDatas = async (type = 'posts', params = []) => {
  const setParam = new URLSearchParams(params)
  const datas = fetchClient.get(type, {params: setParam})
  .then( res => (res.data) )
  const result = await datas
  return result
}

const getPosts = async (param = []) => {
  const baseParam = {
    per_page: 3,
    '_embed': '',
    '_fields': 'title, excerpt, link, _embedded, _links',
  }
  const params = {...baseParam, ...param}
  const datas = await fetchDatas('posts', params)
  return datas
}

3~5行目

axiosの初期設定です。

今回はこのURLをベースに情報を取得すると仮定します。

7~13行目

データを取得するためのベースになる関数です。

8行目

引数のparamsURLSearchParamsに変換しています。

そのまま配列を渡しても反映されませんので、必ずURLSearchParamsを使用するようにしましょう。

9行目

3行目で設定したaxiosの初期設定をベースにデータを取得します。

7行目fetchDatasの引数がtype='posts'params={'per_page: 3'}と仮定すると、
プレーンに書いた場合の状況は下記と同じです。

fetchClient.get('posts', {params: {'per_page: 3'}})

axios.get('//localhost/wp-json/wp/v2/posts?per_page=3')

15~24行目

データを取得して、取得したデータを返す関数です。

16行目, 21行目

baseParamは、案件的に同条件の使いまわしがあったので設定しています。

そのため、21行目でbaseParamparamを連結させています。

18行目

_embed_embeddedを取得する際に必要となります。

_fieldsを指定していない状況で_embeddedを取得できていない場合は、
こちらを指定するだけで取得できるはず
です。

keyに_embedを、valueに''を指定することで下記と同じ状況になります。

//localhost/wp-json/wp/v2/posts?_embed

19行目

取得したjsonデータの圧迫を避けたい方は_fieldsを指定されているのではないでしょうか?

ここで重要なのは_linksです。

_embeddedだけでは_embeddedは取得されません。

_linksと一緒に指定することで_embeddedが取得されます。

なんとややこしい仕様なのでしょうか。。。私はここで数時間無駄にしました。

最後に

ちゃんとWP REST API + URLSearchParams_embeddedが取得できましたでしょうか?

それでは、今回のポイントをおさらいします。

# point

  • パラメーター設定にはURLSearchParamsを使用する
  • _embeddedが必要な場合は_embed: ''_embedを指定してあげる
  • _fieldsを使用する場合は、_embedded+_linksの双方を設定する

WP REST API + URLSearchParams_embeddedの取得ができていない場合、
上記を改善するだけで解決できる可能性が非常に高いのです。

この情報が調べても本当に出てこない。。。

この記事があなたの役に立つことを心から祈っております。

「役に立ったよ!」という方は、ぜひTwittergitのフォローを!

それでは、よいWPライフを!

あわせて読みたい記事

WP REST APIのカスタムエンドポイントにカテゴリー名を追加した話
WPRESTAPIのカスタムエンドポイントにカテゴリー名を追加した話
WPRESTAPIのカテゴリーのエンドポイントに、カテゴリー名などのカテゴリ情報を追加する方法をご紹介します
【投稿全件取得編】WP REST APIで投稿を非同期で全件取得した話
【投稿全件取得編】WPRESTAPIで投稿を非同期で全件取得した話
WPRESTAPIは、全件取得しようと思ってもper_pageが100までしかきいてくれないので、何も考えなければ100件しか取得することができません。 そのため、全件取得しようと思ったら、下記...
【ページネーション編】WP REST APIで投稿を非同期で全件取得した話
【ページネーション編】WPRESTAPIで投稿を非同期で全件取得した話
前記事【投稿全件取得編】で取得してきた投稿に対して、スタンダードなページネーションを子コンポーネントとして追加する方法です。
【タクソノミーフィルター編】WP REST APIで投稿を非同期で全件取得した話
【タクソノミーフィルター編】WPRESTAPIで投稿を非同期で全件取得した話
前記事にてWPRESTAPIで取得した投稿全件に対し、チェックの入ったタームのみ表示させ、ページネーションと連携します。