Parfois sur un site web on est amené à dupliquer certains contenus. Je parle ici de mentions récurrentes que l’on peut trouver dans des pages, des articles ou des produits.

Le problème de la duplication basique est que si vous devez apporter une modification à l’un des textes, vous devez éditer tous les contenus pour y apporter les corrections.

La solution qui vient tout de suite à l’esprit est d’utiliser des shortcodes, ils permettent d’insérer du contenu à différents endroits tout en centralisant la modification.

La création d’un shortcode n’est pas très compliquée mais déjà trop pour un client lambda qui souhaite gérer ses contenus. D’où l’idée d’utiliser l’extension ACF pour offrir une administration des shortcodes. ACF est connu pour permettre l’ajout de champs divers et variés aux différents types de contenus gérés par le site web. Mais ACF permet également de gérer des pages d’options, avec ces mêmes champs.

Dans ACF nous allons dans un premier temps créer un groupe de champs répéteur qui sera composé d’un nom et d’un contenu du shortcode. Le nom est un champ Texte, le contenu est un Éditeur WYSIWYG.

shorcodes-acf

Dans le fichier functions.php du thème, nous allons activer la page d’options d’ACF.

[php]// Faire apparaitre la page Options d’ACF
if( function_exists(‘acf_add_options_page’) ) {
acf_add_options_page();
}[/php]

Nous pouvons dès à présent commencer à saisir nos shortcodes.

shortcodes-options-acf

Maintenant se pose le problème d’exploiter ces options pour générer dynamiquement nos shortcodes.

Seules les dernières versions de php autorisent la création dynamique de fonctions (exemple shortcode_1(), shortcode_2(), etc.). Nous sommes donc contraints d’utiliser une seule fonction associée à nos différents shortcodes (boucle sur les options ACF).

L’astuce est de conditionner le contenu renvoyé par la fonction grâce au troisième paramètre de cette dernière. En effet si l’on utilise fréquemment les deux premiers paramètres (la liste éventuelle des attributs et le contenu éventuel du shortcode), il faut savoir que le troisième paramètre est le shortcode par lui même.

Sur le principe on va effectuer une recherche du nom du shortcode dans le tableau d’enregistrements de l’option ACF.

Ce tableau est du type :

[0][shortcode] = ‘azerty’[0][shortcode_contenu] = ‘Le <strong>texte</strong> de mon shortcode !’[1][shortcode] = ‘qwerty‘[1][shortcode_contenu] = ‘Un autre texte…’

Nous cherchons par exemple qwerty, nous obtenons l’index du tableau (1) et nous pouvons afficher le contenu correspondant (Un autre texte…)

[php]// Il y a des shorcodes
if( have_rows(‘liste_shortcodes’) ):
// nous parcourons les shortcodes
while ( have_rows(‘liste_shortcodes’) ) : the_row();
add_shortcode( get_sub_field(‘shortcode’), ‘custom_shortcode’ );
endwhile;
endif;

function custom_shortcode($atts, $content, $tag) {
$rows = get_field(‘liste_shortcodes’, ‘option’ ); // tous les enregistrements
// récupération du contenu du shortcode par une recherche sur son nom ($tag)
echo $rows[recursive_array_search($tag, $rows)][contenu_shortcode];
}

// Recherche dans un tableau à plusieurs dimensions
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}[/php]

Il est temps d’ajouter nos shortcodes dans du contenu.

shortcodes-insert

Le résultat dans une page produit de WooCommerce.

shortcodes-rendu

Voilà donc une nouvelle application d’ACF pour créer un gestionnaire simple de shortcodes HTML.