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:
Alors, commençons!
Pour suivre, vous aurez besoin de:
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.
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.
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 '=>', ',)); ?>
Copiez cela dans votre nouveau fichier.
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.
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:
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.
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;
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 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.
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:
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é.