Comment coder plusieurs boucles en interrogeant la base de données une seule fois

Je suis un grand fan de la WP_Query class: je l'utilise dans bon nombre de mes sites clients pour interroger et afficher le contenu de manière personnalisée.

Si vous souhaitez exécuter plusieurs boucles sur une page, le moyen le plus simple consiste à exécuter WP_Query chaque fois que vous devez exécuter une boucle. Mais il y a un inconvénient: chaque fois que WordPress lance une requête, il envoie des requêtes à la base de données, ce qui prend du temps et peut ralentir votre site. Et si vous utilisez WP_Query au lieu de la requête principale pour afficher le contenu, la requête principale est alors redondante, ce qui représente un gaspillage de ressources.

Donc, ici, je vais vous montrer comment utiliser une requête pour exécuter plusieurs boucles. Vous pouvez le faire avec la requête principale (ce que je ferai car elle est plus efficace) ou vous pouvez utiliser la même technique avec WP_Query.

Il y a trois parties à ceci:

  • Créer un thème enfant et un fichier modèle.
  • Créer une partie de modèle pour le contenu de la boucle.
  • Créer nos boucles.

Alors, commençons!

Ce dont vous aurez besoin

Pour suivre, vous aurez besoin de:

  • Une installation de développement de WordPress.
  • Un éditeur de code.
  • Publier des messages sur votre site avec plusieurs catégories attribuées. J'utilise les données de test de l'unité de thème WordPress..
  • Le thème vingt seize installé sur votre site.
  • Un thème enfant de vingt-seize installé et activé. Je vais brièvement décrire la configuration du thème enfant ici..

Vous n'avez pas besoin d'utiliser vingt-seize ans avec un thème enfant. Vous pouvez adapter cette technique à votre propre thème. Mais je vais utiliser un enfant de vingt seize ans.

Créer le thème de l'enfant

Commençons par créer le thème de l'enfant de vingt seize ans. Je fais cela parce que je ne veux pas éditer le thème vingt seize.

Dans ton wp-content / themes répertoire, créez un nouveau dossier vide. J'appelle le mien tutsplus-une-requête-deux-boucles.

Dans ce dossier, créez un fichier appelé style.css et ajoutez ceci:

/ * Nom du thème: Tutsplus One Query Multiple Loops URI du thème: http: //.tutsplus.com/tutorials/how-to-code-multiple-loops-while-only-querying-the-database-once--cms-25703 Description: Thème à prendre en charge Tutoriel sur l’exécution de plusieurs boucles lorsqu’on interroge la base de données une seule fois. Thème de l'enfant pour le thème des vingt seize ans. Auteur: Rachel McCollin Auteur URI: http://rachelmccollin.co.uk/ Modèle: twentysixteen Version: 1.0 * / @import url ("… /twentysixteen/style.css");

Maintenant, sauvegardez ce fichier et activez votre nouveau thème.

La prochaine étape consiste à créer un fichier de modèle pour les catégories, ce avec quoi nous allons travailler.

Faites une copie du archive.php fichier de vingt seize ans dans votre nouveau thème. Ne le déplacez pas, mais copiez-le. Renommez-le catégorie.php. Ceci est maintenant le fichier modèle pour les catégories sur votre site.

Création d'un nouveau fichier pièce modèle

La première étape consiste à configurer un nouveau fichier pièce modèle dans notre thème, qui contiendra une version modifiée de la boucle de vingt-seize ans..

Dans votre dossier de thèmes, créez un sous-dossier appelé comprend. À l'intérieur de cela, créez un nouveau fichier appelé loop-category.php.

Maintenant ouvrez le template-parts / content.php fichier à partir du fichier vingt seize et trouver ce code (qui est la plupart du fichier):

> ', esc_url (get_permalink ())),''); ?>
"% s"',' vingt-six ans '), get_the_title ())); wp_link_pages (array ('before' => '
'. __ ('Pages:', 'vingt-six ans'). '',' après '=>'
',' link_before '=>'',' link_after '=>'',' pagelink '=>''. __ ("Page", "vingt-six"). ' % ',' separator '=>', ',)); ?>
"% s"',' vingt-six '), get_the_title ()),'',''); ?>

Copiez cela dans votre nouveau fichier.

Modification de la partie du modèle

La boucle de vingt-seize affiche plus que ce dont j'ai besoin pour cette archive, je vais donc la modifier. Je veux juste afficher l'extrait et non le contenu, donc nous allons l'enlever.

Dans votre nouveau loop-category.php fichier, trouvez ce code et supprimez-le:

"% s"',' vingt-six ans '), get_the_title ())); wp_link_pages (array ('before' => '
'. __ ('Pages:', 'vingt-six ans'). '',' après '=>'
',' link_before '=>'',' link_after '=>'',' pagelink '=>''. __ ("Page", "vingt-six"). ' % ',' separator '=>', ',)); ?>

L’autre étape consiste à remplacer le vingt_sixteen_excerpt () fonctionner avec le standard the_excerpt () fonction, comme la version vingt seize ne comprend pas un lien vers le post complet.

Trouvez cette ligne:

Remplacez-le par ceci:

Nous devons également apporter quelques modifications aux balises de titre..

Dans la partie modèle, modifiez la ligne:

', esc_url (get_permalink ())),''); ?>

Changer la h2 balises à h3:

', esc_url (get_permalink ())),''); ?>

Enregistrez votre fichier de pièce modèle. Maintenant, retournez à votre catégorie.php déposer et continuer à travailler dans ce. 

Créer nos boucles

Tout d’abord, supprimons l’appel de la partie template vingt-seize de notre fichier category.php, car nous devrons utiliser le nouveau fichier à la place..

Dans ton catégorie.php fichier trouver ce code:

get_template_part ('template-parts / content', get_post_format ());

Supprimer ça.

Maintenant nous allons créer les boucles.

Dans cet exemple, je vais d'abord lister tous les articles avec la balise 'content', en utilisant le has_tag () balise conditionnelle.

Cela signifie que je devrai exécuter trois boucles:

  • La première vérifie si la requête a renvoyé des publications avec cette balise.
  • Si tel est le cas, la deuxième sortie affiche les posts avec cette balise.
  • Une troisième sortie des messages sans cette balise.

Entre chacun de ceux-ci, je vais utiliser rewind_posts () pour rembobiner les publications sans réinitialiser la requête: nous travaillons toujours avec la requête principale à chaque fois.

La première boucle: recherche de messages

Dans ton catégorie.php fichier, trouvez le début de la boucle:

while (have_posts ()): the_post ();

Au-dessus de cette ligne, définissez une nouvelle variable appelée $ compte:

$ count = 0;

Maintenant, dans cette boucle, ajoutez ce code:

// vérifie s'il existe des publications avec "tag $ tag = 'content'; if (has_tag ($ tag)) $ count + = 1;

Ceci vérifie si les publications ont la balise 'content' puis ajoute 1 au compte si oui.

Votre boucle va maintenant ressembler à ceci:

// Vérifie les publications dans la première boucle. $ count = 0; while (have_posts ()): the_post (); // vérifie s'il existe des publications avec "tag $ tag = 'content'; if (has_tag ($ tag)) $ count + = 1; endwhile;

La deuxième boucle: sortie des posts avec le tag

L’étape suivante consiste à exécuter une boucle pour afficher les publications avec cette balise, mais uniquement s’il en existe, c’est-à-dire si la valeur de $ compte est supérieur à 0.

Ajoutez ceci en dessous de votre première boucle:

if ($ count> 0) rewind_posts (); écho '

Articles tagués avec '. balise $. '

'; while (have_posts ()): the_post (); if (has_tag ($ tag)) get_template_part ('includes / loop', 'category'); // Termine la boucle. en attendant;

Cela vérifie que $ compte est supérieur à zéro et si tel est le cas, rembobine les publications et exécute à nouveau la boucle. Pour chaque publication, il vérifie si la publication a notre étiquette et, le cas échéant, appelle la partie de modèle que nous venons de créer..

La troisième boucle: sortir le reste de nos postes

La boucle finale affichera les messages restants. Si cette catégorie ne contenait aucune publication portant la balise 'content', toutes les publications de la catégorie seront alors affichées..

Sous votre deuxième boucle, ajoutez ceci:

rewind_posts (); // Deuxième boucle - ne publie pas avec la balise 'content' tandis que (have_posts ()): the_post (); if (! has_tag ($ tag)) get_template_part ('includes / loop', 'category');  // Termine la boucle. en attendant; ?>

Cela rembobine les publications (ce que vous ferez pour la première fois s’il n’y avait aucune publication avec le tag ou la deuxième fois s’il y en avait une), puis exécute à nouveau la boucle. Cette fois, il vérifie si un message ne pas avoir la balise 'content' puis la sortir en utilisant notre partie template.

L'archive finie

Maintenant, testez la page d'archives de catégories sur votre site.

Si vous utilisez les données de l'unité de test WordPress comme moi, vous constaterez que la catégorie "Annotation" comporte des publications avec la balise "content". Voici la page d'archive de catégorie pour la catégorie 'Balisage' sur mon site:

Résumé

Exécuter plusieurs boucles d'une requête n'est pas compliqué. Au lieu de réinitialiser la requête et d’en créer une nouvelle, vous utilisez le rewind_posts () fonction pour rembobiner la requête et l'exécuter à nouveau. Et au lieu de définir de nouveaux paramètres de requête, vous utilisez des balises conditionnelles pour spécifier les publications à afficher..

Note importante: Ne soyez pas tenté d'utiliser query_posts () pour modifier la requête principale lorsque vous faites cela. Cela ralentira votre site plus que si vous aviez utilisé plusieurs requêtes..

Dans cet exemple, nous avons exécuté deux boucles basées sur la requête principale, qui enregistrent en utilisant WP_Query exécuter deux requêtes supplémentaires et réduira la charge du serveur. Vous pouvez appliquer cette technique avec une requête que vous définissez en utilisant WP_Query ou avec la requête principale sur d'autres pages d'archives, en modifiant le fichier de modèle approprié.