web-dev-qa-db-fra.com

La balise <p> interrompt la sortie en shortcode (les autres solutions ne fonctionnent pas)

Je viens de rencontrer un problème étrange. Ma sortie de shortcode qui ressemble à quelque chose comme

'<span class="link_container"><a href="#">'.$content.'</a></span>    
<div class="upgrade_box">
some more divs here
</div>'

est cassé par hasard </p> étiquette de fermeture insérée après </span>

Changer la priorité de wpautop n'a pas fonctionné. La seule solution qui semblait fonctionner était la suppression complète du filtre wpautop, ce qui n'est évidemment pas une si bonne solution.

P.S. J'utilise le thème wp 2015 sur mon site de test, de sorte qu'il ne semble pas y avoir de problèmes avec le thème de la forêt thématique.

1
Igor Yavych

Essayez cette fonction, assurez-vous d'ajouter votre shortcode dans le tableau

// (OPT) STOP SHORTCODES THAT DON'T USE INLINE CONTENT FROM BEING WRAPPED IN A P TAG (until WP fixes this)

// ** NOTE -> BE SURE TO change the array to the shortcodes you are using!

add_filter('the_content', 'the_content_filter');
function the_content_filter($content) {
    // array of custom shortcodes requiring the fix
    $block = join("|",array( 'shortcode_name' ));
    // opening tag
    $rep = preg_replace("/(<p>)?\[($block)(\s[^\]]+)?\](<\/p>|<br \/>)?/","[$2$3]",$content);
    // closing tag
    $rep = preg_replace("/(<p>)?\[\/($block)](<\/p>|<br \/>)?/","[/$2]",$rep);
    return $rep;
}
1
NickFMC

À propos du commentaire de @ nickfmc, voici une version révisée pour le dernier WordPress qui utilise la priorité correcte sur le filtre et corrige également quelques problèmes liés à la regex.

Remarque: il est préférable de conserver chaque shortcode de format de bloc sur sa propre ligne (paragraphe séparé dans l'éditeur WYSIWYG).

<?php

add_filter('the_content', function ($content) {
    $blocks = 'columns|column';

    $replace = [
        "/(?:<p>)?\[($blocks)(\s[^\]]+)?\](?:<\/p>|<br\s*\/?>)?/" => '[$1$2]',
        "/(?:<p>)?\[\/($blocks)\](?:<\/p>|<br\s*\/?>)?/" => '[/$1]',
    ];

    return preg_replace(array_keys($replace), array_values($replace), $content);
}, '10.1');

Bien sûr, remplacez la variable $blocks par vos propres codes courts.

0
Corey