这不是在询问如何关闭自动段落格式
恰恰相反-我正在使用wpautop,但它没有执行我认为应该的段落。
我遇到的问题是我的整个帖子被包装为一个<p>
,然后<br />
被用于所有换行符。
这是一个已迁移了几次的客户端站点,最近一次是从该站点的最新版本的导出中导入帖子。
<br />
标签不在数据库字段中。我只能猜测wpautop的某些内部工作正在与某种特殊字符换行符对齐,这些换行符已在所有迁移中意外替换。
有人会对这是什么有确切的答案吗?如果您可以显示如何解决它而无需手动打开,重新格式化和重新保存数百篇文章,则可加分。
为清楚起见,我希望使用普通的段落,而不是我现在得到的br
更多信息
从PHPMyAdmin复制粘贴内容到Notepad ++时,每行末尾显示(CR)(LF)。也许我对原因有误,因为这应该是正确的?
用法示例
正在做
$product->get_description()
预期收益:
Happy birthday never tasted this good.
Topped with a hand piped personal message. These cupcakes are perfect for any birthday celebration and will put a smile on that special someone's face. A mix of chocolate and vanilla; like any good birthday cupcakes these are loaded with sprinkles!
与数据库中的字段完全匹配:
Happy birthday never tasted this good.
Topped with a hand piped personal message. These cupcakes are perfect for any birthday celebration and will put a smile on that special someone's face. A mix of chocolate and vanilla; like any good birthday cupcakes these are loaded with sprinkles!
但是这样做:
wpautop($product->get_description())
产量:
<p>Happy birthday never tasted this good.<br>
Topped with a hand piped personal message. These cupcakes are perfect for any birthday celebration and will put a smile on that special someone's face. A mix of chocolate and vanilla; like any good birthday cupcakes these are loaded with sprinkles!</p>
尝试让wpautop
执行此操作,我认为这是预期的行为:
<p>Happy birthday never tasted this good.</p>
<p>Topped with a hand piped personal message. These cupcakes are perfect for any birthday celebration and will put a smile on that special someone's face. A mix of chocolate and vanilla; like any good birthday cupcakes these are loaded with sprinkles!</p>
我已经坚持了好几个星期。甚至导致更好调试的建议也是可以接受的。
答案 0 :(得分:1)
如果将$ br的值设置为false,则将删除段落中的换行符。如果设置为true,则将段落转换后剩下的任何换行符转换为HTML <br>
。
我不知道它是否可以解决您的问题,但是值得检查。
wpautop($product->get_description(), false);
这不是一个很好的解决方案,但也许它将解决将<br>
更改为<p>
段的问题
str_replace("<br>", "</p><p>", wpautop($product->get_description()));
答案 1 :(得分:1)
wpautop
函数用<br>
标签替换换行符,这是预期的行为。
这是你可以做的
第1步。像这样在$br
中将wpautop( $pee, $br )
设为假
$br = false;
wpautop($product->get_description(),$br)
这将从您的HTML中删除所有<br>
。
第2步。删除<br>
也会从HTML中删除下一行,因此您需要添加小的CSS代码来再次添加这些新行。
假设您已经用类content
包装了所有内容
像这样
<div class="content"> <?php echo wpautop($product->get_description(),$br); ?> </div>
然后您的CSS代码将
.content > p { white-space: pre-wrap; }
答案 2 :(得分:1)
请注意,我假设相关站点正在运行WordPress 5.xx。
尝试让
wpautop
做到这一点,我相信这是可以预期的 行为:<p>Happy birthday never tasted this good.</p> <p>Topped with a hand piped personal message. These...</p>
不是预期的行为,而是此行为(*请注意,<br />
不是<br>
)
<p>Happy birthday never tasted this good.<br />
Topped with a hand piped personal message. These...</p>
即两行的一个段落,里面带有br
标签;而不是每一行都有一个段落:
在“ baz”之后单行换行:
Foo bar baz.
Lorem ipsum dolor bla blah.
wpautop()之后:
<p>Foo bar baz.<br />
Lorem ipsum dolor bla blah.</p>
在“ baz”之后双行中断:
Foo bar baz.
Lorem ipsum dolor bla blah.
wpautop()之后:
<p>Foo bar baz.</p>
<p>Lorem ipsum dolor bla blah.</p>
这就是为什么这是wpautop
的官方功能参考的摘录:(为简洁起见,重新格式化)
wpautop( string $pee, bool $br = true )
...用HTML段落标记替换 double 换行符。的 转换后剩余的换行符变为
<br />
标签,除非$br
设置为0
或false
。
您甚至可以看到示例here。
如果可以肯定的话,请使用所有默认主题和插件重新安装WordPress,然后将其上传到wp-content/mu-plugins
文件夹(请参阅Must Use Plugins):
<?php // File: wp-content/mu-plugins/test.php
add_action( 'loop_start', function(){
foreach ( [
'Single line break' => 'Happy birthday never tasted this good.
Topped with a hand piped personal message. These...',
'Double line breaks' => 'Happy birthday never tasted this good.
Topped with a hand piped personal message. These...',
] as $title => $str ) {
echo '<h2>' . $title . '</h2>';
echo '<pre>' . esc_html( $str ) . '</pre>';
echo 'After <code>wpautop()</code>:';
echo '<pre>' . esc_html( wpautop( $str ) ) . '</pre>';
}
} );
然后仅查看默认的“ Hello World”帖子。 (或者实际上任何具有“循环”的页面。)
现在,如果要此输出:
<p>Happy birthday never tasted this good.</p>
<p>Topped with a hand piped personal message. These...</p>
尝试一下:
// Note: wpautop() normalizes all line breaks to \n and `br` tags to <br />
$str = wpautop( $product->get_description() );
//$str2 = str_replace( '<br />', '</p><p>', $str );
// These are optional and the above should already give you what you wanted.
// So use these two or just the one above.
$str2 = str_replace( '<br />', "</p>\n<p>", $str );
$str2 = preg_replace( '/<p>\n+/', '<p>', $str2 );
echo $str2;
但这只是一个简单的示例,由于复杂或无效的HTML可能会失败。