0

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

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

几周以来,我一直坚持这一点。甚至可以接受导致更好调试的建议。

4

3 回答 3

1

请注意,我假设相关站点正在运行 WordPress 5.xx。

试图wpautop做到这一点,我认为这是预期的行为:

<p>Happy birthday never tasted this good.</p>
<p>Topped with a hand piped personal message. These...</p>

预期的行为不是那个,而是这个(* 注意<br />which is not <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 段落标签替换换行符。转换后剩余的换行符成为<br />标签,除非 $br设置为0or false

您甚至可以在此处查看示例。

如果您想确定,请使用所有默认主题和插件重新安装 WordPress,然后将其上传到wp-content/mu-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 复杂或无效而失败。

于 2019-07-08T14:29:39.760 回答
1

如果您将 $br 的值设置为 false,您将删除段落中的换行符。如果设置为 true,则段落转换后留下的任何换行符都将转换为 HTML <br>

我不知道它是否能解决你的问题,但值得一试。

wpautop($product->get_description(), false);

这不是优雅的解决方案,但也许它会解决更改<br>为段落的问题<p>

str_replace("<br>", "</p><p>", wpautop($product->get_description()));
于 2019-07-07T14:17:26.340 回答
1

wpautop函数用标签替换换行符,<br>这是预期的行为。这是你可以做的

步骤 1.像这样传入$brfalsewpautop( $pee, $br )

$br = false;

wpautop($product->get_description(),$br)

<br>将从您的 HTML 中删除所有内容。

第 2 步。删除<br>也会从您的 HTML 中删除下一行,因此您需要添加小的 CSS 代码以再次添加这些新行假设您已经用类包装了所有content 内容

<div class="content"> <?php echo wpautop($product->get_description(),$br); ?> </div>

然后你的 CSS 代码将是

.content > p { white-space: pre-wrap; }
于 2019-07-07T14:29:21.330 回答