如何防止换行符出现在短码中?

时间:2016-09-17 作者:George Edison

我创建了一个非常简单的短代码:

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 />? 有没有办法防止这种行为或至少解决它?

1 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

这个<br> 标签来自wpautop(), 这是通过以下方式添加到内容的众多显示过滤器之一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运行do_shortcodewpautop 已在内容上运行。

下面是一个函数,它将删除<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\' );
另一种方法是确保do_shortcode 以前申请过吗wpautop. 这可以通过更改显示过滤器的优先级来实现。

remove_filter( \'the_content\', \'wpautop\' );
add_filter( \'the_content\', \'wpautop\', 99 );
add_filter( \'the_content\', \'shortcode_unautop\', 100 );
请注意do_shortcode 已按优先级11运行,因此wpautop 使用上面的代码完成。

同样值得注意的是,shortcode_unautop 专门针对markup on the outside of the shortcode, not the inside.

相关推荐

SHORTCODE_ATTS()中的$ATTS参数是什么?

这个WordPress developers reference page for shortcode_atts() 国家:$atts(array)(必选)用户在shortcode标记中定义的属性。但我不理解这个定义。例如,在WP Frontend Profile 插件:$atts = shortcode_atts( [ \'role\' => \'\', ], $atts ); 据我所知,shortcode\