WordPress内容使用br代替p

时间:2019-06-20 00:36:10

标签: wordpress

这不是在询问如何关闭自动段落格式

恰恰相反-我正在使用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>

我已经坚持了好几个星期。甚至导致更好调试的建议也是可以接受的。

3 个答案:

答案 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标签;而不是每一行都有一个段落:

  1. 在“ baz”之后单行换行:

    Foo bar baz.
    Lorem ipsum dolor bla blah.
    

    wpautop()之后:

    <p>Foo bar baz.<br />
    Lorem ipsum dolor bla blah.</p>
    
  2. 在“ 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设置为0false

您甚至可以看到示例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可能会失败。