Combinaison de WP_Query avec la requête principale

Jusqu'à présent dans cette série, vous avez appris à utiliser WP_Query créer des requêtes personnalisées à utiliser dans votre thème ou vos plugins.

Dans la plupart des cas, vous utiliserez WP_Query avec un tout nouvel ensemble d'arguments distincts de ceux de la requête principale, mais que faire si vous souhaitez inclure la requête principale dans vos arguments?

Voici quelques exemples de ce que vous voudrez peut-être faire:

  • sur une page de catégorie ou de taxonomie, affichant uniquement les publications d'un type de publication
  • sur une page de catégorie, affichant les posts avec la catégorie actuelle et une autre catégorie ou un terme de tag ou taxonomie
  • sur une page pour un type de publication, affichant uniquement les publications avec certaines métadonnées

Je pourrais continuer, il existe de nombreuses possibilités de combiner la requête principale avec votre propre requête personnalisée.

Je vais illustrer cela avec trois exemples: le premier sera un exemple simple avec une boucle; la seconde utilisera pour chaque pour générer plusieurs boucles, une pour chaque type de publication; et le troisième générera deux types de publication sur une archive de catégorie en utilisant deux requêtes distinctes.

Définir une variable basée sur la requête principale

Cependant, vous allez combiner votre requête principale avec WP_Query, vous devez stocker l’objet de requête actuel d’une manière qui le rend facile à utiliser dans votre WP_Query arguments. Le moyen le plus simple de le faire est de l’affecter à une variable.

Vous faites cela avant de définir votre WP_Query arguments, comme si:

$ mainquery = get_queried_object ();

le get_queried_object () fonction renvoie l'objet actuellement interrogé, quel qu'il soit. Sur un seul post, il retournera simplement l'objet post, tandis que sur une archive, il renverra la catégorie, la balise, l'objet term ou tout objet en rapport avec l'archive. Il retourne l'ID de l'objet interrogé.

Vous pouvez ensuite utiliser cette $ mainquery variable dans votre WP_Query arguments. Voyons maintenant quelques exemples..

Exemple 1: affichage des publications d'un seul type de publication sur une page de catégorie

Supposons qu'un type d'article personnalisé soit ajouté à votre site et que vous ayez activé les catégories pour ce type d'article personnalisé. Dans l'archive des catégories de chaque catégorie, vous ne souhaitez pas afficher les publications. Vous souhaitez plutôt afficher les publications de votre nouveau type de publication. Appelons-la. produit.

Votre requête pourrait ressembler à ceci:

 $ mainquery-> slug, 'post_type' => 'product'); // requête personnalisée. $ query = new WP_Query ($ args); // Vérifier que nous avons les résultats de la requête. if ($ query-> have_posts ()) // Commence à boucler sur les résultats de la requête. while ($ query-> have_posts ()) $ query-> the_post (); // Le contenu des résultats postés interrogés est disponible ici.  // Restaure les données de publication d'origine. wp_reset_postdata (); ?>

Parce que le Nom de catégorie paramètre que j'ai utilisé ci-dessus prend la catégorie slug comme argument, vous devez ajouter -> limace après la variable pour sortir le slug de catégorie.

Cela vous donne une requête qui va chercher les messages de la produit postez le type de la base de données avec la catégorie actuellement interrogée. Vous l'utiliseriez sur le catégorie.php modèle de page.

Remarque: Vous pouvez également obtenir ce résultat en utilisant le pre_get_posts crochet pour modifier la requête principale, combiné avec une fonction conditionnelle pour vérifier les archives de catégorie.

Exemple 2: combinaison de la requête principale avec WP_Query et de foreach pour générer plusieurs boucles

L'exemple suivant affichera tous les articles de la page de catégorie en cours, mais au lieu de les afficher tous dans un bloc, ils seront séparés par type d'article..

Cela signifie que vous pouvez trier vos types d'articles en blocs ou en colonnes sur votre page à l'aide de CSS, ou simplement les séparer en différentes listes..

Pour ce faire, vous utiliseriez le code suivant:

 $ mainquery-> slug, 'post_type' => $ post_type); // requête personnalisée. $ query = new WP_Query ($ args); // Vérifier que nous avons les résultats de la requête. if ($ query-> have_posts ()) // Commence à boucler sur les résultats de la requête. while ($ query-> have_posts ()) $ query-> the_post (); // Le contenu des résultats postés interrogés est disponible ici.  // Restaure les données de publication d'origine. wp_reset_postdata (); ?>

Cela utilise le $ mainquery variable nous avons utilisé auparavant, mais il ajoute également un $ post_types variable pour stocker tous les types de message enregistrés sur le site, et un $ post_type variable pour stocker chaque type de poste individuellement.

Exemple 3: deux requêtes distinctes pour deux types de publication

Le dernier exemple est similaire au second, mais sépare les types de publication en deux requêtes distinctes, chacune avec sa propre boucle distincte. Cela vous donne plus de contrôle sur ce qui est affiché pour chacun, vous pouvez donc afficher les articles différemment des produits, en incluant éventuellement une image sélectionnée pour les produits ou en leur donnant une présentation différente..

Disons que votre site a le produit poste enregistré, avec les catégories activées, et vous écrivez également des articles de blog avec les mêmes catégories. Sur chaque page d'archive de catégorie, vous souhaitez afficher les dix publications les plus récentes, puis une liste de tous les produits de la même catégorie..

Pour ce faire, vous utiliseriez quelque chose comme ce code:

 $ mainquery-> slug, 'post_type' => 'post', 'posts_per_page' => '10'); // requête personnalisée. $ query = new WP_Query ($ args); // Vérifier que nous avons les résultats de la requête. if ($ query-> have_posts ()) // Commence à boucler sur les résultats de la requête. while ($ query-> have_posts ()) $ query-> the_post (); // Le contenu des résultats postés interrogés est disponible ici.  // Restaure les données de publication d'origine. wp_reset_postdata (); // Deuxième argument de requête pour les produits. $ args = array ('category_name' => $ mainquery-> slug, 'post_type' => 'product', 'posts_per_page' => '-1'); // requête personnalisée. $ query = new WP_Query ($ args); // Vérifier que nous avons les résultats de la requête. if ($ query-> have_posts ()) // Commence à boucler sur les résultats de la requête. while ($ query-> have_posts ()) $ query-> the_post (); // Le contenu des résultats postés interrogés est disponible ici.  // Restaure les données de publication d'origine. wp_reset_postdata (); ?>

Vous écririez ensuite chaque boucle différemment pour générer des données différentes pour chaque type de publication..

Résumé

Comme vous pouvez le voir dans les exemples ci-dessus, il est possible d'utiliser WP_Query non seulement pour créer des requêtes complètement personnalisées, séparées de la requête principale, mais également pour incorporer l'objet actuellement interrogé et créer des requêtes plus puissantes sur les pages d'archive.

Les exemples ci-dessus peuvent également être réalisés avec d'autres types d'archives: pour les taxonomies, les auteurs, les dates, etc. Voyez si vous pouvez trouver plus de possibilités!