Modifier la boucle principale
La boucle possède un nombre très important de paramètres qui concernent :
- le nombre de Posts/Pages
- l’ordre
- le type (Post, Page, Attachments)
- la catégorie
- les mots-clefs
- la date de publication
- le statut de publication (Published, Draft, Pending, Future, Private…)
- etc.
Les paramètres par défaut de la boucle
Avant de modifier la boucle, il faut savoir ce qu’elle affiche par défaut :
- Nombre : 10
le nombre de Posts affichés dépend du réglage défini dans Réglages -> Lecture -> Les pages du site doivent afficher au plus - Tri par : date
les Posts s’affichent selon leur date de publication - Ordre : DESC
les Posts s’affichent du plus récent au plus vieux - Statut : publié
seuls les Posts effectivement publiés s’affichent. On omet donc les Posts dont la date de publication est supérieure à la date actuelle, les Posts mis dans la corbeille, les brouillons… - Post Type : post
on affiche les Posts, pas les Pages ou les Attachments - Pagination : oui
une pagination s’affiche dès que le nombre de Posts à afficher dépasser le nombre défini au début (10)
Pourquoi vouloir modifier la boucle ?
Les raisons sont multiples. On peut vouloir que le nombre de Posts par page affichés sur la page d’accueil soit différent de celui des archives. Ou bien on préfère afficher les Posts dans leur ordre de publication. Ou bien on veut afficher tous les Posts sauf ceux d’une certaine catégorie.
Toutes ces modifications possibles sont rarement utilisées pour la boucle principale mais seront très utiles lorsque l’on voudra créer plusieurs boucles (ce que nous verrons plus bas).
Un exemple : afficher 20 Posts par page pour les archives
Imaginons que l’on veuille afficher davantage de Posts par page pour les templates d’archives, histoire de permettre à l’internaute de trouver plus rapidement ce qu’il cherche.
Créons donc archive.php
(que nous n’avions pas encore créé jusqu’ici !) en reprenant le code de category.php
:
<?php get_header(); ?> <div class="main"> <?php query_posts('posts_per_page=20'); ?> <?php get_template_part('loop'); ?> </div> <?php get_sidebar(); ?> <?php get_footer(); ?>
Ta Dah ! Rien de plus simple. On appelle la fonction query_posts()
en lui assignant le paramètre posts_per_page qui gère le nombre de Posts par page. Il faut bien faire attention à l’appeler avant la boucle sinon elle ne sera pas prise en compte.
Boucles multiples
Par défaut, il n’y a qu’une seule boucle par template. Que l’on soit sur la page d’accueil, une page d’archives (catégorie, tag, search), la page dédiée single.php ou page.php, on appelle qu’une seule boucle.
Imaginons que l’on veuille afficher une seconde boucle, à tout moment, dans la sidebar. Comment faire ?
Afficher les 5 derniers articles dans la sidebar, sans plugin
Rouvrons sidebar.php
et ajoutons une nouvelle boucle :
<!-- Derniers articles --> <h4 class="section">Derniers articles</h4> <ul class="list"> <?php wp_reset_postdata(); query_posts('posts_per_page=5'); while (have_posts()) : the_post(); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endwhile; ?> </ul>
Première chose importante : la fonction wp_reset_postdata()
. Elle permet de remettre à zéro le compteur de Posts. Il faut toujours utiliser cette fonction entre deux boucles, sinon le ciel vous tombera sur la tête. D’ailleurs, vous pouvez la rajouter une seconde fois après le endwhile
si vous voulez.
Ensuite, j’ai omis la condition if (have_posts())
qui n’est pas indispensable car nous avons toujours au moins 1 Post.
Enfin, le reste est similaire à une boucle normale : while, permalink et title. Libre à vous d’ajouter/enlever des données.
Sachez que ces boucles multiples vont être indispensables aux Custom Post.
Différence entre query_posts et WP Query
Selon la doc officielle, la différence est simple :
query_posts
permet de modifier la boucle principaleWP Query
permet de créer une deuxième boucle
Mais le souci avec WP Query
est qu’il est plus difficile à manipuler parce qu’il génère un simple objet PHP, alors que query_posts
permet d’utiliser les fonctions principales intégrées à WordPress.
D’ailleurs, ce paragraphe de la doc officielle stipule qu’il est à tout à fait possible d’utiliser query_posts
pour une deuxième boucle. Il suffit d’utiliser la fonction wp_reset_query()
ou wp_reset_postdata()
comme nous l’avons fait ci-dessous.