web-dev-qa-db-fra.com

Comment filtrer par catégorie dans REST API, excluant les messages également dans le terme autre catégorie?

J'utilise REST API pour charger plusieurs publications d'un autre site, chaque publication devant appartenir à une catégorie différente. Cependant, j'ai une catégorie "Événements en vedette", qui inclut les messages également affichés dans une autre catégorie. J'ai donc un message répété dans deux catégories différentes.

Ma requête pour la catégorie sélectionnée est la suivante:

http://localhost/wp-json/wp/v2/events/?categories=23&per_page=1

Et je veux exclure les posts de cette catégorie (déjà affichés en vedette), mais n'apparaissant pas dans les autres domaines, j'ai déjà essayé ces requêtes:

http://localhost/wp-json/wp/v2/events/?categories=42&per_page=1&filter[category__not_in]=23

// but reading category__not_in expects an array instead of a scalar:
// https://developer.wordpress.org/reference/classes/wp_query/#category-parameters
// I've tried this, passing the id of the excluded category as first element of the array:

http://localhost/wp-json/wp/v2/events/?categories=42&per_page=1&filter[category__not_in][]=23

J'ai déjà lu d'autres réponses non liées à REST API, mais aux arguments transmis directement à WP_Query avec le même problème: inclut les publications dans une catégorie, mais exclut également celles appartenant à un autre terme . Les deux semblent fonctionner interrogeant d'abord toutes les publications appartenant à la catégorie exclue, puis en passant ce tableau d'identifiants au paramètre exclude , la requête HTTP ressemblant à ceci:

    http://localhost/wp-json/wp/v2/events/?categories=42&per_page=1&exclude[]=1&exclude[]=2&exclude[]=3

Cependant, cela coûte cher, émettre deux requêtes de base de données, même dans le même backend, mais c'est encore pire, car il s'agirait de deux allers-retours au backend depuis la page HTML.

Y a-t-il une meilleure manière de faire cela? WP_Query ne prend pas en charge deux arguments de catégorie différents dans la même requête? Lorsque je filtre par catégories et tags, il n'y a pas de conflit.

3
Jesús Franco

Selon http://v2.wp-api.org/reference/posts/ , vous avez categories_exclude disponible en tant que paramètre à transmettre à l'API.

Cela devrait fonctionner: http://localhost/wp-json/wp/v2/events/?categories=23&categories_exclude=42&per_page=1

... pour obtenir les messages de la catégorie 23, mais excluez ceux qui ont également 42 catégories.

4
TCattd