Вопрос или проблема
Я добавляю свои пользовательские поля на страницу общих настроек. Одно из них использует редактор WordPress – здесь я вставляю свой HTML-контент. Я создал его с помощью простого фрагмента:
add_action( 'admin_init', 'register_settings_wpse_57647' );
function register_settings_wpse_57647()
{
register_setting(
'general',
'opisproduktyseop',
'esc_html'
);
add_settings_section(
'site-guide',
'Руководство по публикации',
'__return_false',
'general'
);
add_settings_field(
'opisproduktyseop',
'Введите сообщение',
'print_text_editor_wpse_57647',
'general',
'site-guide'
);
}
function print_text_editor_wpse_57647()
{
$the_guides = html_entity_decode( get_option( 'opisproduktyseop' ) );
echo wp_editor(
$the_guides,
'sitepublishingguidelines',
array( 'textarea_name' => 'opisproduktyseop' )
);
}
Проблема начинается, когда я пытаюсь отобразить содержимое из этого поля в своей теме. HTML не работает:
Я отображаю его с помощью:
echo get_option( 'produktyseoopis' );
Это происходит потому, что вы используете esc_html
для обработки настройки, что преобразует все <
, >
и т.д. в HTML-сущности, такие как >
, которые отображаются как <
, но не рассматриваются как эти символы с точки зрения HTML, поэтому теги не отображаются корректно. esc_html
следует использовать для отображения HTML, чтобы разметка была видна читателю.
Если вы хотите обработать HTML, используйте wp_kses_post
в качестве функции для обработки.
ИЗМЕНЕНИЕ: Предложите wp_kses_post
, а не wp_kses
, согласно комментарию Тома.
Хорошо. Я только что решал это! Когда я отображаю его, я использую html_entity_decode()
echo html_entity_decode( get_option( 'produktyseoopis' ) );
Ответ или решение
Ваша проблема связана с неправильным выводом HTML-контента из пользовательского текстового поля на странице общих настроек WordPress. Давайте детально разберем решение данной ситуации, чтобы гарантировать корректное отображение HTML-кода.
Проблема
Вы добавили на страницу общих настроек пользовательское поле, в котором используете редактор WordPress для ввода HTML-контента. Однако, при выводе этого контента на тему, HTML не рендерится корректно. Это происходит из-за того, что вы используете функцию esc_html
для очистки значения, что приводит к преобразованию всех символов (таких как <
и >
) в HTML-сущности, например, <
и >
. Это означает, что теги HTML не будут отображаться корректно.
Решение
Чтобы решить эту проблему, вам необходимо изменить подход к обработке пользовательского ввода. Вместо использования esc_html
для очистки поля, лучше использовать wp_kses_post
, которая позволяет безопасно сохранять и выводить HTML-контент.
Шаги для исправления:
- Измените функцию регистрации настройки следующим образом:
function register_settings_wpse_57647()
{
register_setting(
'general',
'opisproduktyseop',
'wp_kses_post' // Изменение на wp_kses_post для корректной обработки HTML
);
add_settings_section(
'site-guide',
'Publishing Guidelines',
'__return_false',
'general'
);
add_settings_field(
'opisproduktyseop',
'Enter custom message',
'print_text_editor_wpse_57647',
'general',
'site-guide'
);
}
- При выводе содержимого из этого поля, функцию
html_entity_decode
использовать не нужно. Вы можете выводить контент напрямую:
echo get_option( 'opisproduktyseop' ); // Никакого декодирования не требуется
Результат
Данные изменения позволят корректно выводить HTML-контент, введенный в пользовательском поле, без необходимости дополнительного декодирования. Это значительно упростит процесс и уберёт вероятность возникновения ошибок при обработке HTML.
Заключение
Кратко подводя итог, чтобы обеспечить правильное отображение пользовательского HTML в WordPress, необходимо использовать безопасные методы для обработки и хранения содержимого. Использование wp_kses_post
гарантирует, что только разрешённые теги HTML будут сохранены, в то время как ваш контент можно будет свободно выводить с помощью get_option
.
Если у вас возникнут дополнительные вопросы по этой теме или другим аспектам разработки на WordPress, не стесняйтесь обращаться за помощью.