WordPress: changer simplement le rendu des templates tags
18 juin 2009 4 commentairesvite fait en passantparce que ce mois-ci je suis assez chargé (en travail hein) et mon rythme de publication ici s’en ressent.
Attention la lecture de cet article pour les non techos peut piquer très fort les yeux. Âmes sensibles s’abstenir.
Vous le savez très probablement si vous avez déjà utilisé WordPress, il existe tout un tas de fonctions (template tags) pour récupérer du contenu de votre base de données. Vous pouvez même si ça vous chante lancer votre propre requête sql. Mais pourquoi s’embêter à le faire lorsqu’une équipe de développeurs chevronnés a mis en place pour nous des fonctions toutes faites voire même carrément des tags ? Et bien parfois, quand même, les fonctions et les templates tags sont limités. La plupart retournent un contenu formaté, souvent sous forme de listes, en ul, li. Or parfois, il vous faut autre chose, genre un div ou même rien du tout. Alors avant de vous attaquez à la requête sql je dis halte là ! Le barbablog est là pour vous venir en aide. Le barbablog et les expressions régulières.
Je ne m’étendrais pas ici sur les expressions régulières, mais il faut savoir que c’est un truc assez standard qui vous permet grosso modo de faire des rechercher remplacer puissance 10. Elles vous permettent très simplement de changer un tag ou de le supprimer tout en conservant les attributs qui s’y rattachent. Voici un exemple avec la fonction wp_list_categories qui permet de récupérer comme son nom l’indique la liste de vos catégories :
Magie : changer les li en div
<?php
$categories = wp_list_categories('title_li=&orderby=id&echo=0&exclude=1');
// change li to div
$oldTag = "li";
$newTag = "div";
$regExp = "<" . "li" . "[^>]*>";
$regExp = "<" . $oldTag . "[^>]*>";
$categories = str_replace("</$oldTag>", '</' . $newTag . '>', $categories);
$categories = ereg_replace($regExp, '<' . $newTag . '>', $categories);
// display
echo $categories;
?>
Explication vite fait et baclée
- Dans un premier temps je range dans une variable le retour de la fonction wp_list_categories. Je peux le faire grâce au paramètre echo=0 qui indique à la fonction qu’on ne eut pas faire un ‘display’ de la liste. Les autres paramètres indiquent le tpe de classement des catégories : par id (order=id) et le titre que l’ondonne à la liste, en l’occurence aucun (title_li=)
- Ensuite je remplace grâce à la fonction ereg_replace de php et via le motif de mon expression régulière les tags li ouvrants puis je remplace les tags li fermants avec une autre fonciton plus basique celle-là : str_replace, laquelle permet de remplacer une chaîne simplement. Dans le cas des tags fermants, pas la peine d’utiliser d’expression régulière puisque un li fermant sera toujours indqiué </li> – on ne lui passe pas d’attributs, le rechercher remplacer est donc beaucoup plus simple.
- Enfin, une fois ces deux opérations effectuées, j’affiche le résultat : echo $categories. Et le tour est joué !
En terme de performance, si vous pouvez éviter d’avoir recours à ce genre de tour de magie c’est mieux, mais parfois, on n’a pas le choix.
je me demandais si tu faisais exprès de construire ta regexp avec des quotes et des caractères de concaténation pour nous embrouiller encore plus : $regExp = « ]*> »;
…alors qu’un $regExp = « ]*> »; suffisait.
Mais en y réfléchissant un peu plus, d’un point de vue didactique, tu voulais sûrement écrire : $regExp = « ]*> »;
pour garder le caractère « général » de la méthode de substitution de tags.
🙂
Oups ! j’ai oublié d’utiliser la balise ‘code’ dans mon post.
…dommage qu’il n’y ait pas de preview.
je me demandais si tu faisais exprès de construire ta regexp avec des quotes et des caractères de concaténation pour nous embrouiller encore plus :
$regExp = "]*>";
…alors qu’un
$regExp = "]*>";
suffisait.Mais en y réfléchissant un peu plus, d’un point de vue didactique, tu voulais sûrement écrire :
$regExp = "<" . $oldTag . "[^>]*>";
pour garder le caractère « général » de la méthode de substitution de tags.
🙂
Oui en effet. C’est une erreur de ma part. C’était pour garder le caractère générale de la substitution de tags. Tu mets le nom du tag dans la variable $oldTag et hop c’est parti !
Par ailleurs, je rajoute un style pour que ton code si soigneusement et sémantiquement entré dans une balise code s’affiche correctement 😉
Comme j’ai migré récemment sous WP, je découvre également les joies suscitées par les fonctions et variables offertes.
Il y a vraiment des trucs intéressants, mais le lot de choses mal fichues est impressionnant!
Par contre, j’ai découvert que pour chaque snippet il y a une fonction « équivalente » qui ne ramène que les informations relatives à la donnée recherchée.
Ici je pourrais te conseiller de regarder http://codex.wordpress.org/Function_Reference/get_the_category