Masquer les posts d'un tag particulier
Sur Wordpress, la page d'accueil liste généralement les billets (post) triés par ordre antéchronologique.
Ici nous allons voir comment exclure certains articles en se basant sur les tags. On peut aussi utiliser la même technique pour exclure des catégories à la place des tags (de toute façon dans wordpress il y a peu de différences entre les catégories et les tags, les 2 sont gérés par les tables de taxonomie).
Lorsque vous accédez à la page d'accueil d'un blog Wordpress, dans un premier temps le coeur (wordpress core) va initialiser tout un tas de variables et récupérer la liste des articles à afficher, en interrogent la base de données MySQL.
Ensuite il va appeler le template approprié de votre thème, en appliquant les règles de la hiérarchie des templates, template dans lequel la boucle sera chargée d'afficher le listing.
Donc le but du jeu c'est de modifier le comportement du coeur de manière à ce qu'il exclue un tag lorsqu’il va envoyer sa requête à MySQL.
Et pour cela, il existe un hook spécialement conçu à cet usage : pre_get_posts
.
L'idée c'est de modifier l'objet global $wp_query
pour y ajouter notre condition d'exclusion (uniquement pour la page d'accueil et pour le flux RSS). Pour cela, il faut bien entendu placer le code avant que wordpress n'exécute la requête. Donc le seul endroit où l'écrire c'est soit dans le fichier functions.php
de votre thème, soit dans un plugin.
<?php add_action('pre_get_posts', 'pst_exclude_tag_low'); function pst_exclude_tag_low(){ $liste_id_des_tags_a_exclure = array(20, 30); if( is_home() || is_feed() ){ global $wp_query; $wp_query->query_vars['tag__not_in'] = $liste_id_des_tags_a_exclure; } } ?>
Comme vous pouvez le voir, on transmet ici les identifiants des tags, et pas leur "slug".
C'est un peu plus technique puisqu'il faut aller récupérer l'identifiant des tags que vous voulez exclure. Pour cela, il suffit de regarder dans l'URL du formulaire d'édition du tag en particulier, exemple :
http://www.photoshoptuto.com/wp-admin/edit-tags.php?action=edit&taxonomy=post_tag&tag_ID=20
Et voilà, c'est aussi simple que ça.
Pour exclure une catégorie, utilisez simplement le paramètre category__not_in
à la place de tag__not_in
.
Dans un tout autre contexte, cet article est très intéressant : changer la couleur de la grille dans excel.
Vous trouverez plus d'infos et la documentation de tous les paramètres dans le codex Class Reference/WP Query.
WP_Query : la fausse bonne idée
En cherchant sur Google, j'ai trouvé quelques billets sur le même sujet, sauf qu'ils créent une nouvelle requête :
<?php $loop = new WP_Query(array( 'paged' => $paged, 'orderby' => 'title', 'order' => 'ASC', 'cat' => -20 )); ?>
Ca consiste à remplacer le contenu de la boucle en écrasant les articles par défaut que wordpress y a placé par de nouveaux articles issus d'une nouvelle requête WP_Query.
Bien que cette technique fonctionne, elle n'est vraiment pas très intelligente, car la première requête, celle effectuée par le core, ne sert à rien. Et en plus on recréé une seconde requête WP_Query, ce qui alourdit inutilement la charge sur serveur MySQL et du serveur PHP.
La solution présentée sur cette page ne présente pas cet inconvénient, plus qu'on intervient sur les conditions de la requête par défaut qui est exécutée par le core, avant son exécution, grâce au hook.
Encore faim ? allez lire ça : effet couture !
Je ne suis pas familier avec le php. Je tente d'insérer le code dans le fichier fonction.php, mais je ne sais pas ou l'insérer exactement. À chaque tentative, mon site plante. Y a-t-il un endroit spécifique ou l'insérer? Merci!