web-dev-qa-db-ja.com

改行がショートコードに表示されないようにする方法

私は非常に単純なショートコードを作成しました:

function my_shortcode($atts, $content) {
    return '<div class="block">' . do_shortcode($content) . '</div>';
}

add_shortcode('block', 'my_shortcode');

次に、ページのテキスト(HTML)エディタで、次のように入力します。

[block]<h2>Test</h2>[/block]

ショートコードは次のようにレンダリングされると思います。

<div class="block"><h2>Test</h2></div>

しかし、代わりに私は得ます:

<div class="block"><br /><h2>Test</h2></div>

WordPressが<br />を挿入しているのはなぜですか?この振る舞いを防ぐ、または少なくとも回避する方法はありますか?

5
George Edison

<br>タグは、wpautop()から来ています。これは、wp-includes/default-filters.phpを介してコンテンツに追加されるいくつかの表示フィルタの1つです。

// 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はdo_shortcodeフィルターを実行しますafterwpautopは既にコンテンツに対して実行されています。

これは<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' );

別の方法は、wpautopの前にdo_shortcodeを確実に適用することです。これは、表示フィルタの優先順位を変更することによって実現できます。

remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'wpautop', 99 );
add_filter( 'the_content', 'shortcode_unautop', 100 );

do_shortcodeはすでに優先順位11で実行されているので、wpautopの前に実行するという目標は、直前のコードで達成されます。

注目に値することとして、shortcode_unautopはショートコードのoutsideマークアップを扱い、inside は扱いません。

4
Dave Romsey