Shortcodes wordpress imbriqués

Shortcode WordPress imbriqués et sauts de ligne

Un shortcode WordPress sert à retourner un contenu formaté de manière simple. Si vous utilisez des shortcodes WordPress dans vos pages ou posts, il se peut que vous constatiez que leur empilement dans l’éditeur n’entraîne leur enveloppement au milieu de balises <p> ou l’ajout d’un saut de ligne <br /> juste après le rendu. La solution ? Retirez le filtre responsable de cet ajout, ou filtrez vous-même vos shortcodes pour vous laisser plus de souplesse d’écriture

WordPress nous simplifie beaucoup la vie, parfois un peu trop. Nous pouvons ajouter des sauts de lignes dans nos textes, et les voir se transformer automatiquement en nouveaux paragraphes. Mais cette fonctionnalité peut avoir un effet de bord désagréable lorsque nous voulons empiler nos shortcode dans l’éditeur pour plus de lisibilité, comme des shortcodes structurants, utiles aux layouts de nos pages.

Le filtre «wpautop» est responsable des décalages verticaux de nos blocs de contenus lorsque nous chaînons les shortcodes. Nous pouvons donc très bien décider une fois pour toutes de supprimer cette fonctionnalité, et rester maîtres, dans l’éditeur, des paragraphes et sauts de ligne pour nos contenus et nos extraits.

Rien de plus simple : dans le fichier functions.php de votre thème, vous pouvez ajouter ces deux lignes de codes.


	remove_filter( "the_content", "wpautop" );
	remove_filter( "the_excerpt", "wpautop" );

Le filtre « the_content » modifie notre contenu principal alors que « the_excerpt », lui, s’attaque à nos extraits. Ici, on retire le filtre wpautop attribué à ces deux éléments. Tout shortcode WordPress inséré à la ligne sera rendu en l’état, sans balises additionnelles.

Le seul problème est que du coup, wpautop reste désactivé pour l’intégralité du texte tapé dans l’éditeur. Cela prive les utilisateurs WordPress les moins expérimentés d’une fonctionnalité quand même assez confortable. L’idéale serait donc de conserver cette fonctionnalité pour nos textes tout en lui interdisant de toucher à nos shortcodes.

Cibler les shortcodes des contenus pour garantir des sauts de lignes sans paragraphe

Le raisonnement est très simple. Un shortcode WordPress est entouré de crochets « [ » et « ] ». De plus, je sais que si je les passe à la ligne, ils se verront enveloppés d’un paragraphe, donc de balises « <p> » et « </p> », ou seront suivis d’un simple saut de ligne HTML « <br /> »;

Nous pouvons donc à notre tour filtrer notre contenu avec le filtre « the_content » en remplaçant nos diverses possibilités par une chaîne vide (on n’utilise en général nos shortcodes que dans le contenu (rarement l’extrait).

Pour rappel, la fonction PHP strtr() convertit toutes les occurrences des clés du tableau trouvées dans la chaîne en la valeur passée à cette clé, lorsqu’elle reçoit un tableau en second argument :


	function my_shortcode_remove_breaklines( $content ){
		$transpose = array(
			'<p>['	=> '',
			']</p>'	=> '',
			’]<br />'	=> ''
		);
		return strtr( $content, $transpose ); 
	}
	add_filter( 'the_content', 'my_shortcode_remove_breaklines' );

Filtrer vos shortcodes au sein de vos plugins

Si comme moi vous avez développé vos propres shortcodes, un bon réflexe pour les maintenir aisément est de les regrouper dans un plugin dédié à leur installation.

Votre devis en 48 H chrono !

Demandez à être rappelé !

Nous préciserons ensemble votre projet
de vive voix 

On peut alors tout à fait envisager d’appeler le filtre en début de fichier et déclarer ensuite nos raccourcis (« shortcode » devenait un peu répétitif …)


	<?php
	/**
	 * Plugin Name: JST Shortcodes
	* Description: Ajoute des shortcodes perso
	* Author: Bibi
	*/
	if( ! deinied( "ABSPATH ) ) exit;
	if( !class_exists( "JST_Shortcodes" ) ) {
		class JST_Shortcodes {
			function __construct(){
				add_action( 'init', array( $this, 'init' );
				/* Le reste du constructeur */
			}
			public function  init(){
				/* On inclue notre fichier */
				require_once( "inc/shortcodes.php" ); 
			}
		}
		new JST_Shortcodes;
	}
	?>

	<?php
	# inc/shortcodes.php
	/**
	 * Bibi SHortcodes !!
	*/
	function my_shortcode_remove_breaklines( $content ){
		return strtr( $content, array( '<p>[' => '', ']</p>' =>'', ']<br />' => '' ) );
	}

Vous filtrez ensuite le contenu comme précédemment et vous déclarer vos shortcodes en dessous.

Passer un shortcode WordPress à un autre shortcode

L’intérêt d’empiler les shortcodes dans l’éditeur est de conserver une vision relativement claire de la structure créée, ainsi que les informations passées d’un shortcode à un autre.

Depuis le code récupérant le contenu du raccourci, on demande généralement à WordPress d’exécuter les éventuels shortcodes imbriqués avec la fonction do_shortcode( ).

NB : do_shortcode() permet d’exécuter un shortcode sous sa forme « BBcode » (entre crochets : « [nom_shortcode] »)


	<?php do_shortcode( $content ); ?>

do_shortcode() en bref

Un code intuitif entre crochets, c’est bien, mais qu’est-ce qui exécute un shortcode ? Une fonction do_shortcode() est définie dans le fichier /wp-includes/shortcodes.php.

Pour faire simple, elle passe par la fonction native PHP preg_match_all() pour parser votre contenu à la recherche une chaîne correspondant au modèle (au schéma) des shortcodes :


	preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );

NB : Ici les arobases « @ » correspondent aux délimiteurs du pattern, les parenthèses capturent ce qui aura été trouvé.

la fonction cherche une chaîne entre crochets ne comportant ni caractère spécial «NULL» ou espace, ni crochet, ni caractère « & », « <« , « > » ou « = ». Elle compare ensuite avec la liste globale des shortcodes enregistrés (natifs ou tierce partie). Si une correspondance est trouvée, elle exécute la fonction callback enregistrée pour ce shortcode WordPress. WordPress appelle cette fonction avant la sortie de votre contenu pour rendre les éventuels raccourcis insérés.

Pour savoir plus, visitez la page du codex portant sur la fonction do_shortcode()