Dans le chapitre 2, nous avons utilisé la boucle Wordpress pour afficher les posts.
Mais d'où viennent les posts affichés, comment modifier les posts qui sont remontés par la boucle ?
C'est ce que nous allons voir dans ce chapitre. Les points que nous allons aborder ne sont pas nécessaires pour réaliser un thème Wordpress, mais ils permettent de personnaliser votre thème très finement.
get_posts : récupérer des posts dans la base de données
Avant toute chose, je vais vous parler d'une fonction bien utile de l'API Wordpress, il s'agit de get_posts()
.
Cette fonction sert tout simplement à récupérer une liste de posts (billets) dans la base de données, avec de nombreux paramètres :
- nombre de posts remontés
- catégorie (remonter seulement les posts appartenant à telle catégorie)
- ordre des posts (croissant / décroissant)
- type de post
- post
- page
- attachement (pièce jointe)
- status (publié, brouillon)
À ne pas confondre avec query_posts()
, qui fait le même travail que get_posts() sauf que query_posts() va modifier la boucle principale, autrement dit vous allez faire une seconde requête en plus de la requête par défaut faite par Wordpress, et écraser cette dernière avec les nouveaux résultats. Ça n'est d'ailleurs pas génial au niveau des performances et du temps de chargement des pages, de faire plusieurs requêtes.
Voici donc comment s'utilise get_posts($args)
: la fonction prend en paramètre un tableau d'arguments, qui correspond à une liste de conditions :
<?php $args = array( 'numberposts' => 3, // On récupère 3 pages 'orderby' => 'post_date', // Triés par date décroissante (de la page le plus récente à la plus ancienne) 'order' => 'DESC', 'post_type' => 'page', // On ne remonte que les pages, pas les posts ni les attachements 'post_status' => 'publish' // Seules les pages publiées remontent ); $my_posts = get_posts($args); ?>
Pour plus d'informations sur les nombreux paramètres de get_posts, je vous invite à consulter le Codex (documentation de Wordpress).
WP_Query : modifier les posts remontés par défaut
Au cours du chargement d'une page, Wordpress va avant même d'appeler les templates de votre thème (index.php / single.php...), récupérer automatiquement une liste de posts à afficher, en fonction de l'URL (s'agit-il d'une page, d'un post ou d'une liste de post : catégorie, tag, page d'accueil...), dans la base de données.
C'est la fonction WP_Query qui effectue ce travail.
Le problème, c'est que vous ne pouvez pas modifier les paramètres de WP_Query dans votre thème puisque comme je viens de vous le dire, le thème est appelé après WP_Query.
Sauf que, il existe un fichier particulier dans les thèmes Wordpress : functions.php
.
Contrairement aux autres composants d'un thème, functions.php est appelé beaucoup plus tôt dans le processus de chargement d'une page, ce fichier est appelé avant WP_Query, on va donc pouvoir y placer des conditions particulières pour filtrer les résultats.
La requête Wordpress par défaut est stockée dans une variable globale : $wp_query. En utilisant le bon hook on va donc pouvoir modifier cette variable de façon à définir nos propres conditions de filtrage.
On se rapproche ici beaucoup plus de la création de plugins que de la création de thèmes, c'est plus technique. Si vous ne savez pas ce qu'est un hook, ça n'est pas très grave puisque je vais vous indiquer quel hook utiliser, mais sachez simplement qu'un hook correspond à une étape du chargement d'une page, et que vous allez pouvoir demander à Wordpress d'exécuter telle fonction à tel moment en la liant à un hook.
Pour modifier $wp_query, j'utilise un hook qui intervient juste avant que Wordpress n'exécute la requête WP_Query, ce hook s'appelle "pre_get_posts
". Mais vous pouvez très bien utiliser un autre hook si vous savez ce que vous faites, dans le Codex ils utilisent le hook request.
Filtrer les posts avec un tag
Pour l'exemple, nous allons effectuer un filtrage assez simple sur un tag nommé "invisible" (et qui porte l'ID 50 dans la base de données. Tous les posts ayant le tag invisible n'apparaitront pas dans le listing des posts, sauf dans le flux RSS.
Ce code est à placer dans le fichier functions.php de votre thème :
<?php // ======================= // Exclusion tag invisible // ======================= add_action('pre_get_posts', 'exclude_tag_invisible' ); function exclude_tag_invisible(){ global $wp_query; $invisible_tag_id = 50; if( !is_feed() ){ $wp_query->query_vars['tag__not_in'] = array($invisible_tag_id); } } ?>
La première ligne, add_action
, sert à lier ma fonction au hook pre_get_posts, cela revient à dire à Wordpress : "tu dois appeler ma fonction exclude_tag_invisible()
quand tu arriveras au hook pre_get_posts
".
Dans ma fameuse fonction, je commence par déclarer $wp_query en global (sans cette ligne, la variable $wp_query n'existerait qu'à l'intérieur de la fonction, et n'aurait rien à voir avec la variable $wp_query du coeur de Wordpress que l'on souhaite modifier).
Ensuite je place l'identifiant du tag que je veux exclure (50, c'est l'identifiant du tag "invisible" que j'ai trouvé en allant dans la base de données, table wp_terms) dans une variable $invisible_tag_id
.
Enfin, je modifie la condition "tag__not_in
" (littéralement "tag pas dans") en fournissant la liste des IDs des tags à exclure dans un array() : l'identifiant du tag invisible (variable $invisible_tag_id
).
Fini de lire cette page ? allez faire un tour ici : texte printemps, ça peut vous intéresser.
Ce tutoriel fait partie d'un cours : aller au sommaire pour voir les autres chapitres.