C’est la première fois que je travaille avec REST et j’ai de la difficulté à recevoir des posts avec une méta-clé. J'ai ajouté les clés méta dont j'ai besoin à l'aide de register_meta
et en exécutant une demande sur /wp-json/wp/v2/products
, la sortie contient mes champs personnalisés.
Je sais que je peux ajouter ?slug={some slug}
ou ?id={some id}
pour récupérer les publications en fonction de ces valeurs, et cela fonctionne bien pour les tests. Mais je ne peux pas comprendre comment analyser les champs personnalisés car ils sont imbriqués dans les données JSON sous une liste "méta".
Après avoir googlé pendant environ une heure sans résultat, j'ai juste commencé à deviner ce que je devais faire. J'ai essayé un certain nombre de choses comme ?brand_name=test
, ?meta[brand_name]=test
et ?[meta]brand_name=test
, mais aucune de ces méthodes ne semble faire quoi que ce soit.
Je suis sûr qu'il me manque quelque chose d'évident; J'apprécierais vraiment de l'aide. Un exemple de mes données JSON est ci-dessous.
[
{
"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
}
]
}
}
]
Pour accéder aux publications via une clé méta, vous devez vous connecter au [filtre rest_query_vary
]. 1 L'exemple auquel je pensais lorsque j'ai lu votre question est le même que celui trouvé sur le message@ WebElaine commenté. Je l'ai simplement ajouté ci-dessous:
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' );
Appeler comme ça: wp-json/wp/v2/posts?filter[meta_key]=MY-KEY&filter[meta_value]=MY-VALUE
Le filtre est appliqué dans le cadre de WP_REST_Posts_Controller::prepare_items_query
, affiché dans son contexte ici au cas où cela aiderait:
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;
}