Вопрос или проблема
Я добавил пользовательский метабокс, который хранит строку из 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>
.
Вот пошаговое решение вашей проблемы:
- Получение данных из базы данных:
Вы корректно получаете данные с помощьюget_post_meta
и извлекаете значение из массива метаданных.
$post_meta = get_post_meta($pid);
$answer = $post_meta["answer"][0];
- Декодирование HTML-сущностей:
Чтобы преобразовать HTML-сущности в теги HTML, используйтеhtml_entity_decode
. Это необходимо, чтобы HTML-теги, такие как<ul>
и<li>
, корректно отображались в браузере.
$answer = html_entity_decode($answer);
- Добавление переходов на новую строку:
Чтобы добавить переходы на новую строку, используйтеnl2br
. Однако на этом этапе вы заметите, что между тегами<li>
будут добавляться нежелательные переходы на новую строку.
$answer = nl2br($answer);
- Удаление переходов на новую строку между
<li>
тегами:
Для того чтобы избежать добавления переходов на новую строку между элементами списка, вы можете использовать регулярное выражение. Однако, как вы и заметили, ваше текущее решение может быть не самым оптимальным.
Вместо использования preg_replace
, более элегантным решением будет использование следующего подхода:
$answer = nl2br($answer);
$answer = preg_replace('/<li>(.*?)<\/li>/', '<li>$1</li>', $answer);
Этот код преобразует строки в разметку HTML, сохраняя при этом правильное форматирование, и удаляет ненужные переходы на новую строку внутри списков.
- Вывод результата:
Наконец, при выводе результата используйте функцию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;
Таким образом, вы сможете корректно отображать содержимое метабокса с переходами на новую строку, не добавляя лишних переносов между элементами списка. Если у вас возникнут дополнительные вопросы, пожалуйста, дайте знать.