Запрос WP REST API v2 несколькими мета-ключами

Используя v2 API REST, я хочу запросить некоторые сообщения несколькими мета-ключами. С v1 мне удалось отформатировать url как &filter[meta_value][month]=12&[meta_value][year]=2015 и он работал (после выставления метаданных 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; }

При этом я могу фильтровать один мета-ключ, используя URL-адрес, например, фильтр wp-json/wp/v2/posts?filter[meta_key]=test&filter[meta_value]=on .

Тем не менее, похоже, что единственный способ фильтрации на нескольких мета-ключах – это создать настраиваемый фильтр. Может ли кто-нибудь указать мне в правильном направлении?

Solutions Collecting From Web of "Запрос WP REST API v2 несколькими мета-ключами"

Добавление пользовательской конечной точки довольно просто.

Я также изменил 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');