私は非常に単純なショートコードを作成しました:
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 />
を挿入しているのはなぜですか?この振る舞いを防ぐ、または少なくとも回避する方法はありますか?
<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 は扱いません。