この記事をおすすめしたい人
- WordPress REST APIで記事検索の仕方に困っている人
- カテゴリを指定して記事検索をしたい人
- タグを指定して記事検索したい人
- 検索結果を指定した順序で並び替えたい人
- つまりオレ
今回はWordPressのREST APIで、記事を検索する方法をまとめます。
詳細は公式の「Post一覧」という部分にありますが、このタイトルからして分かりにくいので、実際の挙動を確認していきながら日本語でまとめていきたいと思います。
全オプション、丁寧に挙動を確認してきました。
このページの目次
- 1 REST APIでの記事検索の基本
- 2 引数「context」
- 3 引数「per_page」
- 4 引数「page」
- 5 引数「search」
- 6 引数「after」
- 7 引数「before」
- 8 引数「author」
- 9 引数「author_exclude」
- 10 引数「exclude」
- 11 引数「include」
- 12 引数「offset」
- 13 引数「order」
- 14 引数「orderby」
- 15 引数「slug」
- 16 引数「status」
- 17 引数「categories」
- 18 引数「categories_exclude」
- 19 引数「tags」
- 20 引数「tags_exclude」
- 21 引数「sticky」
- 22 まとめ
REST APIでの記事検索の基本
投稿ページの場合、APIのルートに「/wp/v2/posts」を追加するのが基本型です。 固定ページの場合は「/wp/v2/pages」です。
当サイトの場合だとこうなります。
/wp/v2/posts
ここに「?XXXXX=YYYY&xxxxx=yyyy」形式でオプションを追加して検索結果を絞り込んでいきます。 オプションなしの場合は「最新記事10件」を取得します。
以下、オプションの説明です。
これより先に出てくるAPIの出力結果は、「_links」の削除や不要な項目を削除した後の結果です。 かなり項目数が少ないです。 実際の出力結果とは異なりますが、項目が少なくて見やすいのでご容赦を。
引数「context」
「context」は検索結果を絞り込むオプションではありません。
取得する記事を「どのモードにするか?」というオプションです。
値には「view」「embed」「edit」の3種類が指定できます。
詳しくは「embed」の記事に書いたので、ここでは簡単に説明します。
「view」モード
標準的な「表示用」のモードです。 「context」を指定しなかった場合も「view」モードになります。
/wp/v2/posts
/wp/v2/posts?context=view
「view」モードには「ほとんどの記事情報」が含まれます。 記事本文も含まれているためサイズが大きく、記事一覧表示用のAPIとしては向いていません。
記事ページを表示する際のAPIとしての利用が適していそうです。
「view」モードでの出力例↓。
[
{
"id": 107,
"date": "2020-08-14T23:41:21",
"modified": "2020-08-15T15:06:58",
"slug": "test",
"title": {
"rendered": "テストページ"
},
"content": {
"rendered": "<p>本文</p>\n",
"protected": false
}
}
]
「embed」モード
「embed」とは埋め込みという意味です。
記事埋め込みに必要な情報だけに絞られています。 開いてもらうと分かりますが、「view」に比べて明らかにボリュームが少ないです。 「embed」の記事にも書きましたが、本当にサイズが激減します。
「embed」モードは記事一覧表示や記事埋め込みに使うのが適していそうです。
「embed」モードでの出力例↓。
[
{
"id": 107,
"date": "2020-08-14T23:41:21",
"slug": "test",
"title": {
"rendered": "テストページ"
}
}
]
既に項目を削除しまくっているので違いが分かりにくいですが、実際は14もの項目が除外されます。
上でも「modified」と「content」の2項目が除外されています。
「edit」モード
名前の通り編集用のモードです。 記事情報を全て取得することができます。
ですが、そのまま編集用のAPIを叩けてしまうと大問題なので、パスワードを指定しないとエラーが出ます。
{
"code": "rest_forbidden_context",
"message": "この投稿タイプの投稿を編集する権限がありません。",
"data": {
"status": 401
}
}
「context」の使い方
記事ページ(本文が必要)では、「view」モード(または未指定)。
記事一覧(本文が不要)では、「embed」モード。
これだけ覚えておけばよさそうです。
引数「per_page」
検索結果を「何件取得するか」というオプションです。
デフォルトでは10になっています。 変更する場合には数値で指定します。
指定できる最小値と最大値
「1」から「100」までです。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: per_page",
"data": {
"status": 400,
"params": {
"per_page": "per_page は1以上、100以下でなければなりません。"
}
}
}
全件取得する方法は?
REST API側にそういう機能はなさそうです。
世には記事1万越えのサイトとかもあるので当然と言えば当然でしょう。
どうしても全件取得したい場合は、100件ごとに取得し、次の「page」オプションと合わせて、レスポンスがなくなるまで何度も取得する、という方法くらいしかないんじゃないでしょうか。
引数「page」
検索結果の「何ページ目を取得するか」というオプションです。 ページネーションを作る時に使う機能でしょう。
デフォルトでは1になっているので1ページ目を取得します。 変更する場合には数値で指定します。
ここで取得する記事数は「per_page」オプションの影響を受けるので「per_page=2」「page=2」の場合は3~4件目の記事を取得します。
指定できる最小値と最大値
「1」以上のようで、特に上限はなさそう。
それ以外(「0」など)を指定するとエラーがでます。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: page",
"data": {
"status": 400,
"params": {
"page": "page は1以上である必要があります"
}
}
}
記事数を超えるページを指定するとどうなるか
空の配列ではなくエラーが返ります。
{
"code": "rest_post_invalid_page_number",
"message": "リクエストされたページ数は存在するページ数を上回っています。",
"data": {
"status": 400
}
}
引数「search」
文字列で検索するオプションです。
日本語は使える?
使えました。
テスト環境ではURLエンコードしなくても動いていますが、一応しておいた方がよさそう。
複数指定はできる?
できました。
キーワードの連結は「+」でも半角スペースでもできました。 全角スペースはダメです。 文字として認識されています。
こちらも環境によりそうなので、「+」で連結しておいた方が安全そう。
複数指定の場合はAND検索?
AND検索でした。
OR検索はどうやるんだろ。 マニュアルがあっさりし過ぎてて分からないです。
該当記事がひとつも見つからなかった場合は?
空の配列が返りました。
[]
引数「after」
指定した日時「以降に書かれた記事」を検索します。
日付の指定はISO8601だそうです。
/wp/v2/posts? after=2020-08-14T20:00:00
Wikipediaを参考に、基本形式や拡張形式、時間指定あり/なし、タイムゾーン指定のあり/なしとためしましたが、なかなかうまくいかず…。
うまくいったのはコレ↓。
2020-08-14T20:00:00
拡張形式のタイムゾーンなし版です。
要は記事APIの「date」とか「modified」に入っている形と同じ格好でした。
タイムゾーン指定なしで日本時間になるのか?
なりました。
おそらく単純に「date」と「after」の値を比較しているだけです。
「date」が日本時間なら日本時間で検索されます。
日時指定に問題があるとどうなるのか?
エラーが出ます。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: after",
"data": {
"status": 400,
"params": {
"after": "無効な日時です。"
}
}
}
該当記事がなかった場合はどうなるのか?
空の配列が返ります。
[]
未来の日付を指定するとどうなるのか?
「該当なし」と同じ扱いなのか、空の配列が返ります。
[]
引数「before」
指定した日時「以前に書かれた記事」を検索します。
日付の指定は「after」と同様に「2020-08-14T20:00:00」みたいな形式。
/wp/v2/posts? before=2020-08-01T00:00:00
タイムゾーンの問題、日付指定に問題があった場合、該当記事がなかった場合は「after」と同様です。
記事の著者を指定して検索するオプションです。
著者はユーザIDで指定します。
複数の著者を指定する方法
「author=1+2」のように、ユーザIDを「+」で連結します。
著者をスラッグで指定できるか?
できませんでした。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: author",
"data": {
"status": 400,
"params": {
"author": "author[0] は integer タイプではありません。"
}
}
}
どうしてもスラッグで検索したい場合は、先にユーザのAPIをスラッグで検索してユーザ情報を取得し、そのIDで再検索する形になるでしょう。
存在しないユーザIDを指定した場合は?
空の配列が返ります。
[]
指定した著者の記事を除外して検索するオプションです。
著者はユーザIDで指定します。
このサイトは僕しか書いてないので上の結果は空の配列になっています。
複数の著者を指定する方法、スラッグで指定する方法は「author」と同様です。
引数「exclude」
指定した記事を除外して検索するオプションです。
記事はIDで指定します。
複数の記事を指定する方法
「exclude=1+2」のように、記事IDを「+」で連結します。
記事をスラッグで指定できるか?
できませんでした。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: exclude",
"data": {
"status": 400,
"params": {
"exclude": "exclude[0] は integer タイプではありません。"
}
}
}
どうしてもスラッグで検索したい場合は、先に記事APIからスラッグで記事を検索して、そのIDで再検索する形になるでしょう。
引数「include」
指定した記事のみ検索するオプションです。
記事はIDで指定します。 「exclude」同様にスラッグ指定はできません。
複数の記事を指定する方法
「include=1+2」のように、記事IDを「+」で連結します。
これ何に使うの?
分かりません!
単体の記事が欲しいなら「/wp/v2/posts/(ID)」で取得できます。
ID指定で複数の記事が欲しい時…?
例えばですね、「著者Aで絞り込んで、著者Bのこの記事だけ追加してほしい」みたいなケースでは使えるかと思ったんですが、実行してみると「著者Aかつ指定IDの記事」となっているみたいで空の配列が返ってきました。
どういう場合に有効活用できるんでしょう…。
引数「offset」
検索結果を指定したオフセットから開始するオプションです。 オフセットでピンとこない人は「指定した数の上位記事を除外する」と考えてください。
マニュアルは特に記載がありませんが、挙動を見るに初期値0です。
上の例だと最新記事の11番目から表示されます。
指定できる最大値と最小値
たぶん整数なら全て指定できます。
ただし、マイナスの場合はマイナスが無視されます。 「-5」を指定すると「5」と解釈されていました。
整数以外の小数や文字を指定するとエラーが出ます。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: offset",
"data": {
"status": 400,
"params": {
"offset": "offset は integer タイプではありません。"
}
}
}
引数「order」
並び替え順序を指定して検索するオプションです。
「desc」と「asc」が指定でき、デフォルトは「desc」です。
上の例だと「古い記事から10件」が表示されています。
引数「orderby」
並び替えに使用する値を指定して検索するオプションです。
デフォルトは「date」(公開日時)です。
orderbyで指定できるキーの種類
指定できるキーは次の10種類です。
- 「author」:
記事の著者IDでソート - 「date」:
記事の効果日時でソート(デフォルト) - 「id」:
記事IDでソート - 「include」:
「include」オプションで指定した順にソート
「include」を指定しないとエラーが出ます - 「modified」:
更新日時でソート - 「parent」:
親ページIDでソート - 「relevance」:
「search」で指定したキーワードとの関連性でソート
「search」を指定しないとエラーが出ます - 「slug」:
記事のスラッグでソート - 「include_slugs」:
分かりませんでした。「orderby=id&order=asc」の結果と一致しています。なんだこれ。 - 「title」:
記事のタイトルでソート
これ以外を指定するとエラーが出ます。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: orderby",
"data": {
"status": 400,
"params": {
"orderby": "orderby は author, date, id, include, modified, parent, relevance, slug, include_slugs, title, menu_order に当てはまりません。"
}
}
}
カスタムフィールドでソートはできない?
できます。
add_action('rest_post_query', 'sortby_meta_key', 10, 2);
function sortby_meta_key($args, $request) {
if ( isset($request['meta_key']) ) {
$args['meta_key'] = $request['meta_key'];
$args['orderby'] = 'meta_value_num';
if ( isset($request['meta_orderby']) ) {
$args['orderby'] = $request['meta_orderby'];
}
}
return $args;
}
使い方や注意点はカスタムフィールドでソートの記事を見てください。
引数「slug」
スラッグを指定して検索するオプションです。
/wp/v2/posts?slug=wp-rest-slug
注意!結果は配列で返る
スラッグは一見一意(ユニーク)っぽいですが、階層が違うと同じスラッグを指定できます。
この可能性があるため結果は配列で返ります。
詳しくはスラッグで取得する記事を見てください。
部分一致で検索できる?
残念ながらできないようです。
完全一致検索。
スラッグの複数指定はできる?
スラッグ文字列を「+」で連結するだけです。
存在しないスラッグを指定した場合は?
空の配列が返ります。
[]
引数「status」
記事のステータスを指定して検索するオプションです。
デフォルトは「publish」(公開)です。
記事のステータスにはpublishの他に次の7種類があるそうですが、
- 予約済 (future)
- 下書き (draft)
- 承認待ち (pending)
- 非公開 (private)
- ゴミ箱 (trash)
- 自動保存 (auto-draft)
- 継承 (inherit)
「publish」以外を指定すると全てエラーが返ってきました。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: status",
"data": {
"status": 400,
"params": {
"status": "ステータスは禁止されています。"
}
}
}
権限的な問題でしょう。
引数「categories」
記事のカテゴリを指定して検索するオプションです。
カテゴリはIDで指定します。
複数のカテゴリを指定する方法
「categories=8+14」のように、カテゴリIDを「+」で連結します。
カテゴリをスラッグで指定できるか?
できませんでした。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: categories",
"data": {
"status": 400,
"params": {
"categories": "categories[0] は integer タイプではありません。"
}
}
}
どうしてもスラッグで検索したい場合は、先にカテゴリのAPIをスラッグで検索してカテゴリ情報を取得し、そのIDで再検索する形になるでしょう。
存在しないカテゴリIDを指定した場合は?
空の配列が返ります。
[]
引数「categories_exclude」
指定したカテゴリを除外して検索するオプションです。
カテゴリはIDで指定します。
/wp/v2/posts?categories_exclude=14
複数のカテゴリを指定する方法、カテゴリをスラッグで指定する方法は「categories」と同様です。
記事のタグを指定して検索するオプションです。
タグはIDで指定します。
このサイトはタグを使っていないので上の結果は空の配列になっています。
複数のタグを指定する方法、タグをスラッグで指定する方法、存在しないIDを指定した場合の挙動は「categories」と同様です。
指定したタグを除外して検索するオプションです。
タグはIDで指定します。
複数のタグを指定する方法、タグをスラッグで指定する方法は「categories」と同様です。
引数「sticky」
「この投稿を先頭に固定表示」の状態を指定して検索するオプションです。
最初「/wp/v2/posts?sticky」と指定したんですが、以下のエラーが出ました。
{
"code": "rest_invalid_param",
"message": "無効なパラメーター: sticky",
"data": {
"status": 400,
"params": {
"sticky": "sticky は boolean タイプではありません。"
}
}
}
ええぇ…どう見てもbooleanやけど…
と色々と試した結果、エラーが出なかったのは次の2パターンです。
「sticky」を数字で指定
「sticky=0」で「この投稿を先頭に固定表示」がオフのものを、「sticky=1」で「この投稿を先頭に固定表示」がオンのものを表示します。
「sticky」を真偽値で指定
「sticky=false」で「この投稿を先頭に固定表示」がオフのものを、「sticky=true」で「この投稿を先頭に固定表示」がオンのものを表示します。
めちゃめちゃbooleanやないかい!!
ちなみに「この投稿を先頭に固定表示」というのは「クイック編集」の画面に出てきます。 オンにすると記事一覧で最上部に表示されます。
まとめ
以上です! 疲れた!
以上、WordPressからお届けしました!