Пользовательские общие настройки (поле текста) некорректно выводят HTML.

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

Я добавляю свои пользовательские поля на страницу общих настроек. Одно из них использует редактор 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-сущности, такие как &gt;, которые отображаются как <, но не рассматриваются как эти символы с точки зрения 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-сущности, например, &lt; и &gt;. Это означает, что теги HTML не будут отображаться корректно.

Решение

Чтобы решить эту проблему, вам необходимо изменить подход к обработке пользовательского ввода. Вместо использования esc_html для очистки поля, лучше использовать wp_kses_post, которая позволяет безопасно сохранять и выводить HTML-контент.

Шаги для исправления:

  1. Измените функцию регистрации настройки следующим образом:
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' 
    );
}
  1. При выводе содержимого из этого поля, функцию html_entity_decode использовать не нужно. Вы можете выводить контент напрямую:
echo get_option( 'opisproduktyseop' ); // Никакого декодирования не требуется

Результат

Данные изменения позволят корректно выводить HTML-контент, введенный в пользовательском поле, без необходимости дополнительного декодирования. Это значительно упростит процесс и уберёт вероятность возникновения ошибок при обработке HTML.

Заключение

Кратко подводя итог, чтобы обеспечить правильное отображение пользовательского HTML в WordPress, необходимо использовать безопасные методы для обработки и хранения содержимого. Использование wp_kses_post гарантирует, что только разрешённые теги HTML будут сохранены, в то время как ваш контент можно будет свободно выводить с помощью get_option.

Если у вас возникнут дополнительные вопросы по этой теме или другим аспектам разработки на WordPress, не стесняйтесь обращаться за помощью.

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

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