REST APIのv2を使用して、 multiple metaキーで投稿をクエリしたいと思います。 v1では私は&filter[meta_value][month]=12&[meta_value][year]=2015
のようにURLをフォーマットすることができました、そしてそれは(APIにメタ値を公開した後に)うまくいきました。
今v2では、私はこのGitHubスレッドに記載されているメソッドを使用してこれを動作させることができます: https://github.com/WP-API/WP-API/issues/1599#issuecomment-161166805
基本的に、rest_query_vars
フィルタを使ってメタフィールドを追加しました:
add_filter( 'rest_query_vars', 'flux_allow_meta_query' ); function flux_allow_meta_query( $valid_vars ) { $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value', 'meta_compare' ) ); return $valid_vars; }
それで、wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on
のようなURLを使って one metaキーでフィルタリングできます。
ただし、複数のメタキーでフィルタ処理する唯一の方法は、カスタムフィルタを作成することです。誰かが私にそうすることの正しい方向を向けることができますか?
カスタムエンドポイントを追加する はかなり簡単です。
私はまたURLをもっと似たように修正しました
http://example.com/wp-json/namespace/v2/posts?filter[meta_value][month]=12&filter[meta_value][year]=2015
function wp_json_namespace_v2__init()
{
// create json-api endpoint
add_action('rest_api_init', function () {
// http://example.com/wp-json/namespace/v2/posts?filter[meta_value][month]=12&filter[meta_value][year]=2015
register_rest_route('namespace/v2', '/posts', array (
'methods' => 'GET',
'callback' => 'wp_json_namespace_v2__posts',
'permission_callback' => function (WP_REST_Request $request) {
return true;
}
));
});
// handle the request
function wp_json_namespace_v2__posts($request)
{
// json-api params
$parameters = $request->get_query_params();
// default search args
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'numberposts' => -1,
// limit to only ids
// 'fields' => 'ids',
);
// check the query and add valid items
if (isset($parameters['filter']['meta_value'])) {
foreach ($parameters['filter']['meta_value'] as $key => $value) {
switch ($key) {
case 'month':
if (is_numeric($value))
$args['monthnum'] = $value;
break;
case 'year':
if (is_numeric($value))
$args['year'] = $value;
break;
}
}
}
// run query
$posts = get_posts($args);
// return results
$data = array(
'success' => true,
'request' => $parameters,
'count' => count($posts),
'posts' => $posts,
);
return new WP_REST_Response($data, 200);
}
flush_rewrite_rules(true); // FIXME: <------- DONT LEAVE ME HERE
}
add_action('init', 'wp_json_namespace_v2__init');