Nous avons déjà vu comment utiliser l’API des shortcodes de WordPress pour ajouter facilement du contenu dans un article ou une page, de façon automatisée. Avec ce qu’on a appris la dernière fois, nous savons donc comment créer nos propres shortcodes et comment gérer des attributs pour pouvoir utiliser des shortcodes de la forme [hello nom= »toto »]. Ce qu’on n’a pas encore vu, c’est qu’il est aussi possible d’utiliser des attributs sans nom, et ça mine de rien, ça peut être bien pratique.

WordPress

Si vous vous demandez à quoi peut bien ressembler un attribut sans nom, la réponse est assez simple : à peu près tout et n’importe quoi. En fait, vous retrouverez dans votre shortcode la valeur de l’attribut, et c’est tout. Par exemple, ça peut être [nomdushortcode toto], ou bien [nomdushortcode toto attr= »valeur » plop attr2= »valeur »]. Comme vous pouvez le voir, ça peut être aussi compliqué que vous le voulez.

Bien sûr, il est finalement assez peu recommandé de multiplier les attributs sans nom : le plus souvent, dès que possible, préférez des attributs avec nom qui ont l’avantage d’être déjà plus simple simples à gérer et surtout plus faciles à écrire pour l’utilisateur car ne nécessitent aucun ordre particulier. Mais des fois non.

Par exemple, les tags de WP Photo Sphere peuvent contenir un attribut « autoload » qui n’est autre qu’un attribut sans nom. Avec un nom, ça aurait pu donner quelque chose du genre [ sphere autoload= »true »], qui n’aurait servi à rien à part alourdir l’écriture. Bref, comme souvent, vous êtes seul juge.

Afin d’avoir un exemple à suivre tout le long de cet article, nous allons reprendre celui de la partie précédente avec notre fameux tag [hello] qui accepte deux attributs qui sont nom et n. Nous allons ajouter un troisième attribut sans nom totalement débile : si l’attribut cacher est présent, comme dans par exemple [hello nom= »toto » cacher], alors nous n’affichons pas le texte. Je vous avais bien dit que c’était débile.

Comment récupérer la valeur d’un attribut sans nom ?

Les attributs sans nom vous seront envoyés avec les attributs classiques, dans la même variable que nous avions appelée $atts dans la partie précédente. Comme nos attributs n’ont pas de nom, seules leurs valeurs apparaîtront, indexées comme dans un array numéroté. Vous noterez donc que l’ordre est très important, et c’est bien normal : qu’a-t-on d’autre pour différencier des attributs qui n’ont pas de nom ?

Ainsi, si on reprend l’exemple du shortcode [hello nom= »toto » cacher], voici ce qui sera envoyé via notre variable $atts :

Array
(
	[nom] => toto
	[0] => cacher
)

Multiplier les attributs sans nom pourrait ainsi donner un résultat de ce type :

Array
(
	[attr1] => valeur
	[0] => innommable 
	[attr2] => valeur
	[1] => innommable2
)

Pas très compliqué à comprendre jusque-là : WordPress envoie tout dans l’ordre choisi par l’utilisateur, c’est d’ailleurs pourquoi il est obligatoire de tenir un ordre quand vous utilisez plusieurs attributs sans nom. Quand vous n’en utilisez qu’un par contre, c’est un peu différent : ici, nous n’avons que faire que l’utilisateur nous envoie [hello nom= »toto » cacher] ou [hello cacher nom= »toto »], c’est pareil.

De façon basique, pour récupérer la valeur d’un attribut sans nom, il suffit donc de regarder du côté des entrées numérotées. Les problèmes viennent dès que nous voulons des valeurs par défaut : si on applique la fonction shortcode_atts(), WordPress supprimera purement et simplement les attributs sans nom. Pas de bol.

Normaliser les attributs

Nous allons donc voir une méthode de normalisation des attributs : si nos attributs ont un nom, on ne fait rien et, sinon, on leur en donne un. Nous ferons ça à l’intérieur d’une fonction :

Nous allons alors parcourir les attributs un à un via un foreach dans lequel nous ne ferons quelque chose que si l’attribut courant n’a pas de nom, c’est-à-dire seulement si l’index est un nombre. Cette chose que nous allons faire, c’est tout simplement stocker la valeur sans nom dans une entrée avec nom et supprimer l’ancien stockage :

 $valeur) {
		if (is_int($nom)) {
			$atts[$valeur] = true;
			unset($atts[$nom]);
		}
	}

	return $atts;
}
?>

Et le tour est joué : dès qu’un attribut sans nom est trouvé, on le remplace par un attribut portant le nom de sa valeur, et ayant pour valeur true. Par exemple, en appliquant cette fonction à notre array $atts de tout à l’heure, nous obtiendrons :

Array
(
	[nom] => toto
	[cacher] => true
)

Et nous sommes ainsi prêts à gérer nos attributs sans nom comme il se doit, puisque la suite est exactement la même qu’auparavant.