Как я могу запрашивать сообщения по суб-значению с помощью API?

Это мой первый опыт работы с REST, и мне сложно получить сообщения с помощью мета-ключа. Я добавил мета-ключи, которые мне нужны, используя register_meta , и запуская запрос в /wp-json/wp/v2/products , вывод содержит мои пользовательские поля.

Я знаю, что могу добавить ?slug={some slug} , или ?id={some id} чтобы получить сообщения по этим значениям, и это отлично работает при тестировании. Но я не могу понять, как анализировать пользовательские поля, потому что они вложены в данные JSON в листинге «meta».

После Googling около часа безрезультатно, я только начал гадать, что я должен был делать. Я пробовал несколько вещей вроде ?brand_name=test ?meta[brand_name]=test и ?[meta]brand_name=test , но ни один из них, похоже, ничего не делает.

Я уверен, что мне не хватает чего-то очевидного; Я бы очень признателен за помощь. Ниже приведен пример моих данных JSON.

 [ { "id":5, "date":"2017-05-04T10:36:10", "date_gmt":"2017-05-04T15:36:10", "guid":{ "rendered":"http:\/\/products.example.localhost\/?post_type=product&p=5" }, "modified":"2017-05-09T13:41:12", "modified_gmt":"2017-05-09T18:41:12", "slug":"12545xa573", "status":"publish", "type":"product", "link":"http:\/\/products.example.localhost\/products\/12545xa573\/", "title":{ "rendered":"12545XA573" }, "excerpt":{ "rendered":"", "protected":false }, "author":1, "featured_media":32, "comment_status":"open", "ping_status":"open", "template":"", "format":"standard", "meta":{ "brand_name":"test", "sku":"12545XA573", "unit_of_measure":"FT, 1\/8, 1\/16", "length":"3.20 in" }, "_links":{ "self":[ { "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/products\/5" } ], "collection":[ { "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/products" } ], "about":[ { "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/types\/product" } ], "author":[ { "embeddable":true, "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/users\/1" } ], "replies":[ { "embeddable":true, "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/comments?post=5" } ], "version-history":[ { "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/products\/5\/revisions" } ], "wp:featuredmedia":[ { "embeddable":true, "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/media\/32" } ], "wp:attachment":[ { "href":"http:\/\/products.example.localhost\/wp-json\/wp\/v2\/media?parent=5" } ], "curies":[ { "name":"wp", "href":"https:\/\/api.w.org\/{rel}", "templated":true } ] } } ] 

Solutions Collecting From Web of "Как я могу запрашивать сообщения по суб-значению с помощью API?"

Для доступа к сообщениям с помощью мета-ключа вам нужно подключиться к rest_query_vary [ rest_query_vary ]. 1 Пример, о котором я думал, когда я прочитал ваш вопрос, тот же, что и в сообщении @WebElaine . Я просто добавил его ниже:

 function my_allow_meta_query( $valid_vars ) { $valid_vars = array_merge( $valid_vars, array( 'meta_key', 'meta_value' ) ); return $valid_vars; } add_filter( 'rest_query_vars', 'my_allow_meta_query' ); 

Вызов: wp-json/wp/v2/posts?filter[meta_key]=MY-KEY&filter[meta_value]=MY-VALUE


Фильтр применяется как часть WP_REST_Posts_Controller::prepare_items_query , показанный здесь в контексте, если это помогает:

 protected function prepare_items_query( $prepared_args = array(), $request = null ) { $query_args = array(); foreach ( $prepared_args as $key => $value ) { /** * Filters the query_vars used in get_items() for the constructed query. * * The dynamic portion of the hook name, `$key`, refers to the query_var key. * * @since 4.7.0 * * @param string $value The query_var value. */ $query_args[ $key ] = apply_filters( "rest_query_var-{$key}", $value ); } if ( 'post' !== $this->post_type || ! isset( $query_args['ignore_sticky_posts'] ) ) { $query_args['ignore_sticky_posts'] = true; } // Map to proper WP_Query orderby param. if ( isset( $query_args['orderby'] ) && isset( $request['orderby'] ) ) { $orderby_mappings = array( 'id' => 'ID', 'include' => 'post__in', 'slug' => 'post_name', ); if ( isset( $orderby_mappings[ $request['orderby'] ] ) ) { $query_args['orderby'] = $orderby_mappings[ $request['orderby'] ]; } } return $query_args; }