WordPress regorge de fonctionnalités et de possibilités, tous les webmasters peuvent s'accorder sur ce point, mais il est admis que tout n'est pas toujours évident à mettre en oeuvre tant le codex est vaste. Lors de la conception de ma dernière extension, Modal Portfolio, je me suis retrouvé embêté avec un cas que je n'avais encore jamais rencontré avant, j'ai pensé qu'il serait bon de m'arrêter dessus quelques minutes avec vous...
Je voulais afficher du contenu formaté (sauts de ligne, mises en gras, en italique...) au sein d'une fonction. Pour cela, il est commun d'utiliser la fonction apply_filters() du codex WordPress pour filtrer "the_content" et donc afficher les textes comme il se doit. Sauf que, apply_filters() ne peut pas fonctionner au sein d'une fonction apply_filters(), et ces cas peuvent arriver de temps en temps (cela génère une erreur WordPress), notamment si vous utilisez l'extension PageBuilder (siteOrigin) par exemple (très présente dans les thèmes payants vendus par ThemeForest). Par conséquent, comment afficher un contenu formaté dans deux apply_filters() ?
Comment afficher the_content formaté dans deux apply_filters() ?
Si vous appelez la colonne "post_content" de la base de données WordPress, vous récupérez un texte non formaté (sans les sauts de ligne notamment), de même que si vous utilisez d'autres méthodes que celle d'apply_filters() comme get_post_field("colonne_cible", "ID_du_post"). Par conséquent, nous sommes dépendants des méthodes utilisées par cette fonction, il a juste fallu gratter un peu dans le code... :D
En fait, la solution est assez simple si vous analysez les fonctions d'affichage des contenus. Le filtre de "the_content" utilise plusieurs fonctions dont wpautop() qui sert à formater les sauts de ligne des contenus, il suffit alors de contourner apply_filters() avec cette fonction pour afficher le contenu dans sa mise en forme authentique.
Voici le code originel de WordPress qui fonctionne lorsque ce n'est pas utilisé dans apply_filters() :
$texteComplet = apply_filters('the_content', get_post_field('post_content', $post->ID));
Voici le code corrigé et fonctionnel pour formater les contenus si vous êtes déjà dans apply_filters() :
$texteComplet = wpautop(get_post_field('post_content', $post->ID));
N.B. : cette astuce fonctionne parfaitement pour le filtre de contenu "the_content", mais il faudrait trouver des solutions équivalentes pour chaque type de filtre ciblé via apply_filters(), à condition que la fonction soit utilisé dans un autre apply_filters() bien entendu ! ^^