web-dev-qa-db-fra.com

Comment empêcher newline d'apparaître en shortcode?

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?

5
George Edison

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 .

4
Dave Romsey