やりたかったこと
カスタムフィールドの値を用いて取得結果をソートしたかった。
結論
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で
$query_args = $this->prepare_items_query( $args, $request );
と、prepare_items_query
という処理を経て、
$posts_query = new WP_Query();
$query_result = $posts_query->query( $query_args );
ここでWP_QUERY::query()
の引数として用いられていることが分かります。
ここまで分かれば、実際に設定できる内容は以下のリファレンスを見れば理解できます。
あとは指定したい検索条件の指定方法を探して、連想配列の形で指定を行うことができます。
rest_[post_type]_query
フィルターでは$request
という引数(WP_REST_Requestインスタンス)も受け取っているので、この値を用いて特定のリクエストのみで検索条件を設定することも出来ます。