今天在使用短代码的时候老是遇到一个问题:就是 WordPress 会自动在 shortcode 内添加 br 或者 p 标签,这样打乱了原先预想的 HTML 结构和布局。造成这个问题的原因是 WordPress 默认的日志内容处理流程中,wpautop(将回车转换成 p 或者 br 标签的函数)是在 Shortcode 前面运行的。先来简单介绍下wpautop函数,然后讲解如何解决这个问题。
wpautop函数简介
将文本中的两个换行符转换成 HTML 段落 (< p>…< /p>),其余的换行转换成 < br />
WordPress 使用这个函数对日志内容和摘要进行格式化处理。
wpautop函数用法
1 |
<?php wpautop( $foo, $br ); ?> |
$foo
(string) (required) 将格式化的文本。
Default: 无
$br
(boolean or integer) (optional) 保留换行符,当设置为 true ,段落转换完成之后余下的换行符将转换成 <br />
HTML 标签,script 和 style 后面的换行符不受影响。
Default: 1
wpautop函数实例
1 2 3 4 5 6 7 8 9 10 |
<?php $some_long_text = <<<TXT Some long text that has many lines and paragraphs in it. TXT; echo wpautop($some_long_text); ?> |
输出结果
1 2 3 |
<p>Some long text<br/> that has many lines</p> <p>and paragraphs in it.</p> |
wpautop函数的禁用与调整
为了解决shortcode的问题,我们可以调整wpsutop函数的执行顺序,在在当前主题的 functions.php 文件中添加:
1 2 |
remove_filter( 'the_content', 'wpautop' ); add_filter( 'the_content', 'wpautop' , 12); |
这样调整顺序之后, shortcode 里面的内容,就不会有自动添加的 p 或者 br 标签,但是如果 shortcode 中部分的内容又需要一些 p 或者 br 标签用来换行的话,可以自己在 shortcode 处理程序中添加 wpautop 来处理了。
1 2 3 4 5 |
function bio_shortcode($atts, $content = null) { $content = wpautop(trim($content)); return '<div class="bio">' . $content . '</div>'; } add_shortcode('bio', 'bio_shortcode'); |
小结
以上内容参考了我爱水煮鱼的文章,针对自己遇到的问题进行了解决,后面还会讲解shortcode的使用。