Afin de hiérarchiser les articles, WordPress vous permet d’utiliser des catégories et des sous catégories. Ceci permet de sectoriser finement vos contenus.
WordPress par défaut dans une catégorie affiche les posts enfants direct de cette catégorie, ainsi que les articles présents dans la sous catégorie. Ce réglage convient dans la plupart des cas, mais vous pouvez avoir le besoin de n’afficher que les articles enfants directs de la catégorie en cours. C’est ce que nous allons voir, et plus précisement dans Elementor. Pour cela nous allons intervenir sur la loop et sa query via un id de requête et pour bien comprendre cet article servira d’introduction : https://www.soon7.net/revue-du-web/comprendre-et-utiliser-la-puissance-de-la-loop-de-wordpress/
Le template archive catégorie
Nous avosn créé dans Elementor un template archive spécifiquement pour une catégorie donnée, et on indique un ID de requête à un bloc « Publications », dans notre cas : « afficher_posts_directs »
Grâce à l’id de requête, nous allons pouvoir intervenir dans la query, et indiquer qu’on veut UNIQUEMENT les articles de la catégorie en cours et pas les articles des sous catégories.
La documentation de la WP_QUERY
En lisant la doc officielle de la wp_query, (https://developer.wordpress.org/reference/classes/wp_query/), on voit qu’il y a 2 moyens pour récupérer les articles d’une catégorie donnée,
- ‘cat’ qui va sélectionner les posts de la catégorie et des sous catégories
- ‘category__in’ qui ne sélectionnera QUE les articles enfants directs de la catégorie (et ne ramènera donc pas les articles des sous catégorie)
Code
L’idée est donc de dire à la query d’utiliser le paramètre ‘category__in’ avec la valeur de l’id de la catégorie actuelle utilisée dans la loop.
Pour se faire, on va utiliser un filtre personnalisé sur la requête de notre bloc publication, grâce à l’id qu’on a choisi pour faire la liaison, à savoir : « afficher_posts_directs »
function query_posts_directs($query)
{
// On indique ici par l'usage de category__in qu'on veut uniquement les posts directs de la catégorie et pas ceux des sous catégories
// On ne sélectionne que les articles de la catégorie actuelle du contexte de la loop, en récupérant l'id de la catégorie actuelle via la query elle
// meme avec $query->get('cat')
$query->set('category__in', $query->get('cat'));
}
// On fait la liaison avec l'ID de la requete du bloc
add_action('elementor/query/afficher_posts_directs', 'query_posts_directs');
https://developers.elementor.com/docs/hooks/custom-query-filter/