WordPress: changer simplement le rendu des templates tags

18 juin 2009 4 commentaires
Je vous livre vite fait en passant une petite astuce pour WordPress pour changer très simplement le rendu des templates tags. Je dis vite fait en passant parce 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

  1. 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=)
  2. 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.
  3. 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.

Réagissez

Si ce billet vous a plu ou si vous voulez apporter des précisions, ou si vous n’êtes pas d’accord avec ce que je raconte, c’est ici qu’il faut vous manifester. Je me réserve toutefois le droit de supprimer toute contribution insultante ou qui n’aurait rien à voir avec la choucroute.

  1. 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.

    🙂

  2. 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 😉

  3. 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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.