Вывод текстовой области метабокса и предотвращение разрывов строк внутри тегов li

Вопрос или проблема

Я добавил пользовательский метабокс, который хранит строку из textarea в базе данных. Теперь, если я просто выведу метабокс вот так:

$post_meta = get_post_meta($pid);
$answer = $post_meta["answer"][0];
echo $answer;

HTML-теги будут экранированы, и текст будет выглядеть так:

blah blah blah <ul><li>blah blah</li><li>blah</li></ul>

Как вы видите, HTML-теги экранируются и отображаются как строка, поэтому я использую PHP вот так:

$answer = html_entity_decode($answer);

Теперь HTML-теги работают как ожидалось, но остается одна проблема. Чтобы получить переносы строк из базы данных, я добавляю еще одну строку вот так:

    $answer = nl2br($answer);

Это решает проблему с переносами строк, но добавляет новый перенос строки между каждым тегом li.

Есть идеи, как это решить? Мне нужны переносы строк, но в то же время я хотел бы избежать добавления переноса строки между тегами li.

ОБНОВЛЕНИЕ: на данный момент я добавил эту строку PHP после nl2br, и я получил результат

    $answer = preg_replace("!</li>[\s\S]{1,100}?<!", "</li><", $answer);

Но я не думаю, что это правильный способ.

Чтобы добавить переносы строк внутри <textarea> (но не в выводе на фронтенде), используйте это внутри textarea:

echo str_replace('</li>',"</li>\r\n", $answer);

Почему бы вам не использовать <?php esc_textarea( $answer ); ?>

Ответ или решение

Для того чтобы корректно выводить содержимое метабокса, содержащего текст из текстового поля с разметкой, вам нужно учесть несколько моментов. Ваша задача состоит в том, чтобы сохранить переходы на новую строку, добавленные пользователем в текстовом поле, и избежать переходов на новую строку между тегами <li>.

Вот пошаговое решение вашей проблемы:

  1. Получение данных из базы данных:
    Вы корректно получаете данные с помощью get_post_meta и извлекаете значение из массива метаданных.
$post_meta = get_post_meta($pid);
$answer = $post_meta["answer"][0];
  1. Декодирование HTML-сущностей:
    Чтобы преобразовать HTML-сущности в теги HTML, используйте html_entity_decode. Это необходимо, чтобы HTML-теги, такие как <ul> и <li>, корректно отображались в браузере.
$answer = html_entity_decode($answer);
  1. Добавление переходов на новую строку:
    Чтобы добавить переходы на новую строку, используйте nl2br. Однако на этом этапе вы заметите, что между тегами <li> будут добавляться нежелательные переходы на новую строку.
$answer = nl2br($answer);
  1. Удаление переходов на новую строку между <li> тегами:
    Для того чтобы избежать добавления переходов на новую строку между элементами списка, вы можете использовать регулярное выражение. Однако, как вы и заметили, ваше текущее решение может быть не самым оптимальным.

Вместо использования preg_replace, более элегантным решением будет использование следующего подхода:

$answer = nl2br($answer);
$answer = preg_replace('/<li>(.*?)<\/li>/', '<li>$1</li>', $answer);

Этот код преобразует строки в разметку HTML, сохраняя при этом правильное форматирование, и удаляет ненужные переходы на новую строку внутри списков.

  1. Вывод результата:
    Наконец, при выводе результата используйте функцию echo, чтобы вывести ваш отформатированный ответ.
echo $answer;

Полный код решения:

$post_meta = get_post_meta($pid);
$answer = $post_meta["answer"][0];
$answer = html_entity_decode($answer);
$answer = nl2br($answer);
$answer = preg_replace('/<li>(.*?)<\/li>/', '<li>$1</li>', $answer);
echo $answer;

Таким образом, вы сможете корректно отображать содержимое метабокса с переходами на новую строку, не добавляя лишних переносов между элементами списка. Если у вас возникнут дополнительные вопросы, пожалуйста, дайте знать.

Оцените материал
Добавить комментарий

Капча загружается...