Améliorer les sticky posts
Aujourd’hui je vous propose de découvrir quelques astuces autour d’une fonctionnalité de WordPress trop rarement exploitée : les sticky posts, ou articles à la Une.
Que sont les sticky posts ?
Il s’agit d’un système apparu dans WordPress 2.7 et qui permet de charger les contenus importants de son site en début de liste sur la page de blog. Cela fonctionne un peu de la même façon que lorsqu’on épingle un tweet sur son profil Twitter…
Plus concrètement, il s’agit de cocher une case dans la fenêtre d’édition des articles qu’on souhaite mettre en Une. Cette liste est enregistrée dans une option du site. Lors de la requête principale de la première page du blog, WordPress exécute une sous-requête pour ajouter les sticky posts devant la liste des articles (#inception).
On peut aussi jouer avec les articles à la une directement dans une WP_Query
grâce à des paramètres comme 'post__in' => get_option( 'sticky_posts', array() ),
ou 'ignore_sticky_posts' => 1,…
Des sticky Custom Post Types ?
Par défaut, cette fonctionnalité est limitée aux articles… cependant il existe de nombreux cas où l’on aimerait en faire bénéficier d’autre types de contenus.
Par exemple :
- si vous souhaitez appeler les sticky de CPT pour faire des diaporamas en page d’accueil ;
- si vous souhaitez exploiter un CPT à la place des articles dans vos archives de blogs…
Le hic, c’est que l’option des sticky posts est codée de façon assez spécifique : l’input a cocher est inscrit « en dur » dans la metabox de publication des articles (pas de hook pour ajouter directement la checkbox a cet endroit), mais la valeur est sauvegardée dans une option (au lieu d’une metadonnée) sans trop de vérification.
Pour ajouter la fonctionnalité sticky, il faut donc juste se débrouiller pour ajouter la checkbox !
Nous n’avons pas de hook, alors on va faire « un tunnel entre deux hooks d’actions » pour ajouter le champ où l’on souhaite (une astuce à base de ob_start
, ob_get_clean
et de regex 😉).
- Le premier pavé de code est une fonction qui vérifie qu’on peut ajouter l’option : on vérifie les droits de l’utilisateur et on choisit les types de contenus souhaités.
- Ensuite je démarre le tampon de sortie PHP sur le hook
post_submitbox_minor_actions
: plus rien ne sera écrit dans la page metabox à partir deob_start()
… - … jusqu’à ce que l’on stop le tampon ligne 25 avec
ob_get_clean()
. La variable$temp
récupère ce qui avait été écrit par PHP dans la metabox ; on peut alors y injecter nos checkboxes en ciblant l’endroit voulu grâce à une expression rationnelle.
Et voilà ! On peut maintenant épingler nos types de contenus personnalisés 😀
Vous pouvez utiliser la fonctionnalité en appelant directement les contenus à la une dans vos WP_Query()
. Si vous souhaitez utiliser le système en natif, il faut juste pensez à autoriser vos types de contenu à apparaitre dans la requête de la page des articles, avec un code du genre :
Gérer les sticky_posts avec Advanced Custom Fields
Pour des utilisateurs néophytes, je trouve que le système pour choisir les articles à la une est très discret ; on peut le chercher longtemps sans le trouver 😕
Il m’arrive donc d’utiliser le plugin Advanced Custom Fields pour gérer l’ensemble des sticky_posts sur une seule et même interface. Je créer un champs de type « sélecteur d’articles multiple » et je le place sur une page d’option de l’administration, ou bien directement dans une metabox de la page « racine du blog ».
Enfin, je synchronise la lecture et l’enregistrement des valeurs de ce champ sur notre option sticky_posts
, avec les snippets ci-dessous.
Si on passe par une metabox de page :
… ou si on choisit plutôt un champ sur une page d’option :
Et bien sûr, l’ensemble de ces interfaces sont synchronisées ! On peut donc mettre à la fois la checkbox, la page de réglage, et faire une metabox sur la page du blog.
Modification du nombre d’articles par page
Pour finir, il y a une dernière chose qui me dérange avec la façon dont sont implémentés les sticky posts dans WordPress : elle ne tient pas compte de la pagination.
Par exemple si vous avez dix articles par page et quatre article fixés, ce sont quatorze éléments qui apparaitront sur votre home page. Selon la mise en page de votre thème cela peut être gênant…
Je vous propose de créer une « variable de requête personnalisée » qui va nous servir pour indiquer à WordPress que l’on veut que le nombre d’articles par page tienne compte des sticky posts :
Grâce à cette variable on va pouvoir indiquer, juste après que WP_Query ai ajoutée les stickies, que l’on souhaite au maximum autant d’articles que ce qui a été défini par posts_per_page
.
Notre page d’accueil contient maintenant exactement le nombre d’éléments souhaités.
Il reste cependant un dernier détail : lorsqu’on accède à la seconde page d’archive du blog, les articles tronqués par le code précédent ont disparus ! Pour ajuster ça, on va jouer sur le décalage des articles…
- La première fonction nous sert à tester qu’on est sur une home paginée ;
- si tel est le cas alors on s’assure que la requête ne renverra aucun article à la une ;
- on décale l’offset du nombre d’article ayant été tronqué, auquel on ajoute la page courante (l’usage d’
offset
fait sauter la pagination native) ; - enfin on indique à WordPress d’inclure les éléments « fixés » dans le nombre d’articles trouvés (afin de ne pas fausser le nombre de pages total.
C’est tout pour ce tutoriel, j’espère qu’il vous sera utile. N’hésitez pas à partager vos impressions en commentaires ou sur les réseaux Twitter/Facebook 😬