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の仕様上、async
await
を使用していますので、コンパイルは必要です。
成功するコード例
成功するコード例は下記のとおりです。
成功するためのポイントは、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行目
引数のparams
をURLSearchParams
に変換しています。
そのまま配列を渡しても反映されませんので、必ず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行目でbaseParam
とparam
を連結させています。
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
の取得ができていない場合、
上記を改善するだけで解決できる可能性が非常に高いのです。
この情報が調べても本当に出てこない。。。
この記事があなたの役に立つことを心から祈っております。
「役に立ったよ!」という方は、ぜひTwitter・gitのフォローを!
それでは、よいWPライフを!