La boucle WordPress : utilisation sur une page d’accueil

La page d’accueil de mon site est définie via un modèle. J’y ai codé « en dur » ce qui doit figurer sur cette page. Je voulais en particulier y voir une liste des derniers articles publiés. Calà m’a contrainte à mieux comprendre la fameuse boucle (Loop) WordPress. Voici quelques éléments que j’ai appris. 

La situation initiale

J’avais beaucoup travaillé la présentation (CSS) de la liste d’article et j’étais plutôt contente. Mais je me suis rendue compte que la boucle elle même présentait quelques défauts :

  • Les articles mis en avant étaient listés en premier, quelle que soit leur date de publication ;
  • Des articles de catégories spécifiques apparaissaient alors qu’il valait mieux l’éviter ;
  • Des articles privés apparaissaient également. Pour ce point, ce n’était pas grave car lorsque je regardais le site sans y être connectée, ils n’étaient pas visibles.

J’ai constaté que je devais apprendre un peu plus sur le fonctionnement de la boucle…

Comprendre ce qu’est une boucle WordPress

La meilleure source pour tout comprendre, si l’on parle anglais est cette série d’articles « Mastering WP_Query » de code.tutsplus.com. En voici un extrait traduit.

Une boucle WordPress, WP_Query, est composée de 4 éléments principaux :

  • Les arguments de la requête, c’est à dire les paramètres qu’elle devra respecter ;
  • La requête elle même;
  • La boucle ;
  • Fermeture des if et while et remise à zéro des informations de requête.

 

Celà ressemblera à ce qui suit :

<?php
 
$args = array(
    // Les Arguments de ma requete.
);
 
// Requête personnalisée.
$query = new WP_Query( $args );
 
// Vérifier que la requête a des résultats.
if ( $query->have_posts() ) {
 
    // Faire une boucle sur les résultats.
    while ( $query->have_posts() ) {
 
        $query->the_post();
 
        // Le contenu des résultats de la requête va ici.
 
    }
 
}
 
// Restaurer les éléments originaux de postdata.
wp_reset_postdata();
 
?>

Pour avoir les résultats souhaités, il faut donner les bons paramètres…

Arguments pour les articles mis en avant

Par défaut, la boucle WordPress met les articles mis en avant en premier dans toute les boucles. Pour l’éviter, il faut ajouter la ligne suivante dans les arguments de la requête.

'ignore_sticky_posts' => true,

L’ordre de tri des articles

Pour trier les articles, j’ai beaucoup de choix. Ici j’ai décidé de les trier par ordre de date (de publication). Mais j’aurais aussi pu les trier selon d’autres critères. J’ai essayé avec ‘modified’, qui trie alors selon la dernière date de mise à jour. Mais la difficulté est qu’une simple correction orthographique est une mise à jour…

'orderby' => 'date', 
'order' => 'DESC',

Exclure certaines catégories

Je voulais exclure la catégorie « Aide » qui contient des articles d’aide au développement ou à la mise à jour du site et qui ne concerne pas particulièrement les internautes. J’ai donc ajouté la ligne suivante.

 

'category__not_in'	=> '5', /* exclude category "AIDE" */

Pour savoir quelle est l’identification d’une catégorie, c’est étonnament préhistorique : aller dans « catégorie » du tableau de bord WordPress. Positionner la souris sur la catégorie dont on veut connaître le nom. Au bout d’une seconde environ, on voit apparaître tout en bas de la fenêtre le lien complet de la catégorie. On relève alors le nombre qui suit « tag_ID= »… On peut aussi cliquer à droite sur la catégorie et enregistrer son lien. On obtient une adresse du genre :

http://mon_site/wp-admin/edit-tags.php?action=edit&taxonomy=category&tag_ID=5&post_type=post

On peut ainsi relever que l’ID de cette catégorie est 5.

Au final ma boucle qui marche :

<div id="content" class="hfeed">

<?php 

//Protect against arbitrary paged values
// http://codex.wordpress.org/Function_Reference/paginate_links
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;

$loop = new WP_Query(
		array(
			'post_type' 		=> 'post',
			'posts_per_page' 	=> 8,
			'paged'				=> $paged,
			'ignore_sticky_posts' => true, /* will not show featured posts first */
			'orderby' => 'date', /* 'modified' last modified 'date' would order by published date */
			'order' => 'DESC',         /* 'ASC' */
			'tax_query' => array(
				array(
					'taxonomy' => 'post_format',
					'field' 	=> 'slug',
					'terms' 	=> array(
									'post-format-aside',
									'post-format-audio',
									'post-format-chat',
									'post-format-gallery',
									'post-format-image', 
									'post-format-link', 
									'post-format-quote',
									'post-format-status',
									'post-format-video'
								),
					'operator' 	=> 'NOT IN'
				)
			),
			'category__not_in'	=> '5', /* exclude category "AIDE" */
			'post__not_in' => $do_not_duplicate
		)
	); ?>

		
	<h2>Les derniers articles du blog</h2>

	<?php get_template_part( 'loop-meta' ); // Loads the loop-meta.php template. ?>		

	<?php if ( $loop->have_posts() ) { ?>


		<?php while ( $loop->have_posts() ) : $loop->the_post(); $do_not_duplicate[] = get_the_ID(); ?>

			<?php get_template_part( 'content', ( post_type_supports( get_post_type(), 'post-formats' ) ? get_post_format() : get_post_type() ) ); ?>


		<?php endwhile; ?>

	<?php } ?>

	<a href="<?php echo get_permalink( get_option( 'page_for_posts' ) ); ?>">Tous les articles du Blog</a>

</div><!-- .content-secondary -->
	
<?php wp_reset_query(); ?>

En conclusion

Si je veux plus tard que les articles modifiés en profondeur apparaissent dans la liste des derniers articles, il faudra sans doute que je crée une meta_value « modif_importante » que je mettrai à 1 si c’est le cas. Il faudra ensuite que je trouve comment faire une boucle qui trie selon « modification » ou « date » selon que la modification a été importante ou non…

 

 

Poster un Commentaire

avatar
  S’abonner  
Notifier de