Posted at

WordPress REST API での検索条件設定

More than 1 year has passed since last update.


やりたかったこと

カスタムフィールドの値を用いて取得結果をソートしたかった。


結論

rest_[post_type]_query フィルターフックに処理を適用することでREST APIで検索条件の設定が行えます。

例えば以下のようにフィルターフックに処理を追加することで、特定の投稿タイプ(今回はpost)の投稿一覧を取得する際に指定のカスタムフィールドの降順でソートされた結果が返ります。

add_filter('rest_post_query', function ($args, $query) {

$args['orderby'] = 'meta_value_num'; // meta_value_numは数値として扱う、meta_valueだと文字列扱い
$args['meta_key'] = '[カスタムフィールド名]';
return $args;
}, 10, 2);


詳細

rest_[post_type]_query フィルターはWP_REST_Posts_Controller::get_items( WP_REST_Request $request )内(L261)で適用されています。

WP_REST_Posts_Controller::get_items()

このフィルターは引数を2つ($args, $request)を取り、$argsを返却します。

さらにこの返却された$argsがどう使われているかを見ると、L262で


L262

$query_args = $this->prepare_items_query( $args, $request );


と、prepare_items_queryという処理を経て、


L290~291

$posts_query  = new WP_Query();

$query_result = $posts_query->query( $query_args );

ここでWP_QUERY::query() の引数として用いられていることが分かります。

ここまで分かれば、実際に設定できる内容は以下のリファレンスを見れば理解できます。

WordPress 関数リファレンス/WP Query

あとは指定したい検索条件の指定方法を探して、連想配列の形で指定を行うことができます。

rest_[post_type]_queryフィルターでは$requestという引数(WP_REST_Requestインスタンス)も受け取っているので、この値を用いて特定のリクエストのみで検索条件を設定することも出来ます。


参考