この記事をおすすめしたい人
- WordPressのREST APIからスラッグ指定で記事を取得したい人
- スラッグ指定で記事を取得したのに、何故か思ったのと違う記事が表示されてしまう人
- つまりオレ
今回はWordPressのREST APIからスラッグ指定で記事を取得します。
仕様書通りにやるだけでめっちゃ簡単な内容ですが、サイトの作り方によってはちょっとリスキーな手法です。
リスクを理解した上でうまいやり方をしましょう。
スラッグが一意(ユニーク)じゃないの知ってた?
REST APIの仕様を見ると、ID指定なら決め打ちで記事を取得できます。
例えばこんな↓風に。
/wp/v2/posts/53
「53」の部分は記事IDです。
ところが仕様の「Postを取得する」を見てもスラッグ指定で特定の記事を返す方法が書いてありません。
これはですね、WordPressのスラッグが一意じゃないからです。
試しに自分のWordPressで複数の記事に同じスラッグを付けてみてください。 絶対パスが完全一致になる場合は末尾に「-2」とかつきますが、階層が違うと同じスラッグを付けられるんです。
つまり、WordPressの仕様上、スラッグ指定では記事をひとつに絞り込めないようになっているんです。
もしスラッグ指定で記事を取得したのに、思った記事と違う記事を取得してしまっている人がいたら、別の記事とスラッグが重複しているせいかもしれません。
スラッグで記事を探すには検索するしかない
スラッグでピンポイント取得はできませんでしたが、スラッグ指定で「検索」することなら可能です。
/wp/v2/posts?slug=slug_name
「slug_name」の部分に検索したい記事のスラッグを入れてください。
当サイトでの実例だとこんな感じ。
期待通り、指定した記事がひとつ表示されているだけなので何も問題はないんですが、注意点があります。
開いてもらうと分かりますが、通常のID指定での取得と違い、JSONの先頭に「[」、末尾に「]」がついてます。
つまり配列が返っているんです。 この場合は要素1個の配列です。
なんでこんなことになるのかは先ほど説明した通り、スラッグが一意じゃないからです。
同じスラッグの記事が複数あるケースがあるので、配列が返っているんです。
なので、REST APIを利用する側で記事にアクセスするには配列の最初の要素にアクセスしないといけません。
スラッグ指定の根源的な問題点
仕様上、スラッグの重複が許容されているので、スラッグ指定で記事を取得する場合には、
絶対に同じスラッグを指定してはいけない!
これを自分で管理しておかないといけません。
まぁ、実際には「/wp/v2/posts」を指定する段階で、投稿タイプを「投稿」に限定しているのでそうそうトラブルを起こすことはないと思いますが、パーマリンクを「/(カテゴリ名)/(ページスラッグ)/」みたいな感じで生成していると、平気でスラッグの重複が起こりうるでしょう。
パーマリンクにカテゴリやタグを含めている人は気を付けた方がいいです。
僕はそもそもURLにカテゴリやタグを入れること自体が間違いではないかと思っていて、
別のカテゴリ指定したくなったらどうすんの?
とか
カテゴリ複数指定する場合はどうすんの?
とか、ろくなことにならなさそう。
あと、カテゴリのスラッグを変更する場合もですね。
SEO狙いでそういう感じのことがしたいなら、パンくずリストとその構造化データで示してやればいいと思います。 変更するとパンくずの内容が変わりますが、URLが変わるリスクよりはだいぶ低くなります。
まとめ
WordPressのREST APIからスラッグ指定で記事を取得する場合はこの↓ようにリクエストします。
/wp/v2/posts?slug=slug_name
ただし、スラッグは一意じゃないので配列が返ります。 API操作する場合は配列の1番目の要素にアクセスするように。
スラッグの重複があった場合は当然複数の記事を取得してるので、どっちが欲しい記事なのか判別する用意も必要です。
以上、WordPressからお届けしました!