WordPress 2.5 et les ShortCodes #3 – contenu et imbrication

Ceci est le dernier article de ma suite sur les shortcode dans WordPress 2.5. Nous avons vu précédemment ce qu’était un shortcode et comment lui passer des paramètres. Dans cet article, nous allons voir comment les utiliser pour mettre en forme du contenu et les imbriquer entre eux.

Imaginons que nous souhaiterions utiliser deux styles spécifiques dans nos articles :

  • un premier qui permet d’insérer un encart aligner à gauche ou droite de notre page pour y insérer des données complémentaires au contenu, un peu à la façon des encarts dans les journaux. Nous appellerons ce style encart
  • un second pour mettre en évidence un contenu. Nous l’appellerons warning.

Dans le fichier style.css de notre thème, nous allons créer les règles pour ces deux classes :

.encart{
	width: 150px;
	border: 1px solid black;
	margin: 5px;
}

.warning{
	background: #ffb49d;
	font-weight: bold;
}

Dans notre fichier functions.php, nous allons créer une première fonction pour le shortcode de nos encarts. La fonction devra prendre pour paramètre le type d’alignement souhaité (gauche ou droite) et récupérer le contenu situé entre les balises du shortcode pour le mettre en forme. Soit la fonction suivante :

// [encart align=left|right]
function encart_func($atts, $content = null){

    // s'il n'y a pas de contenu, on s'arrête là...
    if (is_null($content))
    return false;

    // on extrait les paramètres pour savoir si on aligne le bloc à droite ou à gauche. Par défaut, à gauche
    extract(shortcode_atts(array('align' => 'left'), $atts));

    if ( 'left' == $align ){
        $class = "alignleft";
    } elseif ( 'right' == $align ) {
        $class = "alignright";
    }

    // on crée notre encart
    $output = '<div class="encart '. $class .'">' . $content . "</div>\n";

    // on affiche le tout
    return $output;
}
add_shortcode('encart', 'encart_func');

C’est le second paramètre de notre fonction, $content qui va permettre de récupérer le contenu compris entre les balises du shortcode. Il est initialisé avec une valeur null par défaut ce qui permettra d’exécuter la fonction quand même (si besoin est) en l’absence de contenu et/ou de tester ceci à l’aide de is_null($content) et de déterminer un comportement approprié. Dans mon cas, sans contenu, j’arrête la fonction car elle n’aurait plus aucun sens (créer un div vide ne me servirait à rien).

Le paramètre $align permettra quand à lui d’ajouter la classe alignleft ou alignright qui fera « flotter » le contenu du côté désiré dans notre article.

Pour insérer un encart dans nos billets, il suffira désormais d’écrire [encart align="right"]Ceci est un petit encart de test... Qu'en pensez-vous ?[/encart]. Ci-dessous, un exemple du résultat obtenu :
Encart inséré dans un article à l\'aide du shortcode [encart]

Nous allons maintenant faire sensiblement pareil pour le shortcode warning :

// [warning]$content[/warning]
function warning_func($atts, $content = null){
    if ( is_null($content) )
    return false;

    $output = '<div class="warning">'. $content ."</div>\n";
    return $output;
}
add_shortcode('warning', 'warning_func');

Voilà, nos deux shortcodes sont opérationnels. Maintenant, il se pourrait très bien que nous souhaitions mettre du contenu de type « warning » dans un encart ! Cependant, si on tente d’écrire dans un billet le code [encart align="right"][warning]ceci est un encart auquel il faut prêter attention ![/warning][/encart], nous risquons d’être surpris. En effet, seul le shortcode [encart] sera correctement interprété et pas le warning. Le résultat ne correspondra donc pas à notre attente.
shortcodes imbriqués générant une erreur de sortie

Pour imbriquer des shortcodes, nous devons explicitement autoriser les « parents » à exécuter les shortcodes qui pourraient leur être imbriqués à l’aide de la fonction do_shortcode(). Nous allons donc modifier la fonction encart_func() pour que son contenu puisse avoir des shortcodes. Changeons la ligne $output = ... ainsi :

$output = '<div class="encart '. $class .'">' . do_shortcode($content) . "</div>\n";

Cette simple modification nous permettra d’obtenir le résultat attendu : [encart] peut contenir des [warning] (mais pas l’inverse !).
Résultat des shortcodes correctement imbriqués

Il existe toutefois une limitation à cette technique ! Il est en effet impossible d’imbriqué des shortcodes du même nom actuellement, ainsi [encart][encart]mon test[/encart][/encart] par exemple ne fonctionnera pas correctement !

Voilà, nous avons terminé notre tour d’horizon des shortcodes dans WordPress 2.5. Il reste bien sûr quelques fonctionnalités à découvrir (je vous renvoie à la documentation officielle pour ça) mais nous avons déjà de quoi bien nous amuser avec ça ! N’hésitez pas à tester et à me faire part de vos remarques, questions ou commentaires…

articles précédents sur les shortcodes :

Continuez votre lecture

7 commentaires

Emma a dit le 18 avril 2008 à 8:09

c’est moi ou t’es vachement productif quand je suis pas là ??

enfaite je crois que j’aurais mieux fait de me taire….

RépondreRépondre
Emmanuel a dit le 6 juin 2008 à 11:25

Excellent tutorial, clair et précis.
Je voulais te signaler que cet article n’est pas accessible depuis les deux premiers tuto de la série (le lien n’est pas bon).

Emmanuel.

RépondreRépondre
burningHat a dit le 6 juin 2008 à 11:57

@Emmanuel: merci beaucoup pour ton commentaire… Je me suis effectivement bien planté sur mes liens. C’est corrigé ! Merci encore !!!

RépondreRépondre
oblik a dit le 18 octobre 2010 à 14:15

Merci, ça m’a sauvé pour imbriquer le shortcode « nextgen galerie » dans un autre shortcode.

RépondreRépondre
burninghat a dit le 18 octobre 2010 à 18:01

De rien, content que ce tuto serve encore! :-)

RépondreRépondre
rafael a dit le 10 juillet 2011 à 15:25

ahhhh … un gros merci pour ce tuto qui vient largement de me débloquer sur l’imbrication de shortcode … petit bonheur du dimanche !

RépondreRépondre
burninghat a dit le 10 juillet 2011 à 15:38

De rien, je suis ravi que ce tuto ai pu te servir! ;-)

RépondreRépondre

5 trackbacks

Jean-Marie Gall.com » Blog Archive » Ma Revue de Presse 2.0 | 18 - 18 avril 2008 à 12:03

[...] 2.5 et les ShortCodes #3 – contenu et imbrication by Burninghat.net [...]

» Revue de web de la semaine #2 (WordPress, développement web et miscellanées…) « css4design : des css pour votre design html - 21 mai 2008 à 21:32

[...] de shortcodes, des tutoriels sur la création de shortcodes avancés. Voir aussi la série des trois tutoriels sur les Shortcodes de burningHat. Comme vous pouvez le voir sur le visuel, j’en ai profité pour créer un petit [...]

WordPress 2.5 et les ShortCodes #1 - Présentation « burningHat - 6 juin 2008 à 11:56

[...] WordPress 2.5 et les ShortCodes #3 – contenu et imbrication  [...]

WordPress 2.5 et les ShortCodes #2 - les paramètres « burningHat - 6 juin 2008 à 12:05

[...] WordPress 2.5 et les ShortCodes #3 – contenu et imbrication  [...]

WordPress 2.5.x: les shortcodes - Emmanuel GEORJON - 16 octobre 2008 à 0:48

[...] (fr) WordPress 2.5 et les ShortCodes #3: Contenu et imbrication – BurningHat.net [...]