J'ai créé un shortcode extrêmement simple:
function my_shortcode($atts, $content) {
return '<div class="block">' . do_shortcode($content) . '</div>';
}
add_shortcode('block', 'my_shortcode');
Ensuite, dans l'éditeur de texte (HTML) d'une page, j'entre:
[block]<h2>Test</h2>[/block]
Je m'attends à ce que le shortcode soit rendu comme suit:
<div class="block"><h2>Test</h2></div>
Mais au lieu de cela je reçois:
<div class="block"><br /><h2>Test</h2></div>
Pourquoi WordPress insère-t-il un <br />
? Existe-t-il un moyen de prévenir ce comportement ou au moins de le contourner?
La balise <br>
provient de wpautop()
, qui est l’un des filtres d’affichage ajoutés au contenu via wp-includes/default-filters.php
:
// Display filters
add_filter( 'the_content', 'wptexturize' );
add_filter( 'the_content', 'convert_smilies', 20 );
add_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'shortcode_unautop' );
add_filter( 'the_content', 'prepend_attachment' );
add_filter( 'the_content', 'wp_make_content_images_responsive' );
...
// Shortcodes
add_filter( 'the_content', 'do_shortcode', 11 ); // AFTER wpautop()
WordPress exécute le filtre do_shortcode
après que wpautop
a déjà été exécuté sur le contenu.
Voici une fonction qui supprimera la balise <br>
( source ):
function shortcode_wpautop_fix( $content ) {
// Define your shortcodes to filter, '' filters all shortcodes
$shortcodes = array( '' );
foreach ( $shortcodes as $shortcode ) {
$array = array (
'<p>[' . $shortcode => '[' .$shortcode,
'<p>[/' . $shortcode => '[/' .$shortcode,
$shortcode . ']</p>' => $shortcode . ']',
$shortcode . ']<br />' => $shortcode . ']'
);
$content = strtr( $content, $array );
}
return $content;
}
add_filter( 'the_content', 'shortcode_wpautop_fix' );
Une autre approche consiste à s'assurer que do_shortcode
est appliqué avant wpautop
. Cela peut être accompli en modifiant la priorité des filtres d'affichage.
remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop', 99 );
add_filter( 'the_content', 'shortcode_unautop', 100 );
Notez que do_shortcode
est déjà exécuté à la priorité 11, aussi l'objectif de l'exécuter avant wpautop
est atteint avec le code ci-dessus.
Il convient également de noter que shortcode_unautop
traite spécifiquement du balisage sur le outside du shortcode, pas de l'intérieur .