Контент WordPress использует br вместо p - PullRequest
0 голосов
/ 20 июня 2019

Здесь не спрашивается, как отключить автоматическое форматирование абзаца

Скорее наоборот - я использую 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 ]

1 голос
/ 07 июля 2019
Функция

wpautop заменяет символ новой строки тегом <br>, что является ожидаемым поведением.Вот что вы можете сделать

Шаг 1. Передать $br как ложь в wpautop( $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; }
1 голос
/ 08 июля 2019

Обратите внимание, что я предполагаю, что рассматриваемый сайт работает под управлением 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( <em>string</em> $pee, <em>bool</em> $br = true )

... заменить двойные разрывы строк тегами абзаца HTML. оставшиеся разрывы строк после преобразования становятся <br /> тегами, если только $br установлено на 0 или false.

Вы можете даже увидеть пример здесь .

И если вы хотите быть уверенным, сделайте новую установку WordPress со всеми стандартными темами и плагинами, а затем загрузите ее в папку wp-content/mu-plugins (см. Должны использовать плагины ):

<code><?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 ) . '
'; echo 'After wpautop():'; echo '
' . esc_html( wpautop( $str ) ) . '
'; } });

А затем просто просмотрите сообщение "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.

1 голос
/ 07 июля 2019

Если вы установите значение $ br в false, вы удалите разрывы строк в абзацах. Если установлено значение true, любые разрывы строк, оставшиеся после преобразования абзаца, преобразуются в HTML <br>.

Я не знаю, решит ли это вашу проблему, но стоит проверить.

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

Это не элегантное решение, но, возможно, оно решит проблему, изменив <br> на пункт <p>

str_replace("<br>", "</p><p>", wpautop($product->get_description()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...