Проблема: автоматическое преобразование HTML в WooCommerce
В WooCommerce при выводе описания товаров или пользовательских полей иногда происходит автоматическое преобразование HTML-тегов, что приводит к нежелательному экранированию или удалению кода. Это мешает реализовать кастомные HTML-блоки в описании, например, для вставки таблиц, стилей или скриптов.
Диагностика проблемы
Чтобы понять, происходит ли автоматическое преобразование HTML, выполните следующие действия:
- Откройте страницу товара в админке и вставьте в описание HTML-код с простыми тегами, например,
<div style="color:red;">Текст</div>. - Сохраните товар и посмотрите на фронтенде, как отображается описание.
- Если вы видите <div> в виде текста, а не как HTML-блок, значит происходит экранирование кода.
Другая причина — фильтры WordPress, такие как wp_kses или wpautop, которые автоматически форматируют контент.
Как отключить автоматическое преобразование HTML в WooCommerce
Шаг 1. Отключаем фильтр wpautop
Функция wpautop автоматически добавляет <p> и <br> в текст. Она часто ломает кастомный HTML.
remove_filter('the_content', 'wpautop');
remove_filter('woocommerce_short_description', 'wpautop');Добавьте этот код в файл functions.php вашей темы или в отдельный плагин.
Шаг 2. Отключаем фильтр wp_kses_post для описания товара
WooCommerce и WordPress по умолчанию очищают HTML через wp_kses_post, чтобы защитить от вредоносного кода. Если вы уверены в безопасности HTML, можно отключить этот фильтр.
remove_filter('woocommerce_product_description', 'wp_kses_post');
remove_filter('woocommerce_short_description', 'wp_kses_post');Обратите внимание, что в WooCommerce фильтры могут называться иначе, например, применяться через the_content или woocommerce_short_description. Проверьте с помощью remove_filter.
Шаг 3. Используем хук woocommerce_product_get_description для вывода чистого HTML
Если предыдущие методы не сработали, можно перехватить получение описания товара и вернуть его без фильтрации:
add_filter('woocommerce_product_get_description', function($description) {
return $description; // Возвращаем без изменений
}, 99);Проверка результата после внесения изменений
Чтобы убедиться, что HTML больше не преобразуется:
- Добавьте в описание товара кастомный HTML, например таблицу или стилизованный блок.
- Обновите страницу товара на сайте и проверьте, что HTML отобразился корректно (без тегов в виде текста).
- Проверьте код страницы через браузер (через <inspector>), чтобы убедиться, что теги не экранированы.
Частые ошибки и как их исправить
- Ничего не изменилось после remove_filter — Возможно, фильтр добавлен плагином с высоким приоритетом. Используйте более высокий приоритет или проверьте, какие фильтры применяются с помощью
remove_all_filters('the_content')для диагностики. - HTML все равно обрезается — WooCommerce может использовать собственные функции очистки. Проверьте, не включена ли в настройках безопасность, которая блокирует HTML.
- Отображается пустой блок — Возможно, HTML не сохраняется в базе. Проверьте, что редактор не переключается на визуальный режим, который удаляет теги.
Практические советы по безопасности и производительности
- Отключая фильтры очистки HTML, вы снижаете защиту сайта. Используйте этот подход только если уверены в источнике HTML.
- Для безопасного добавления кастомного HTML лучше использовать ACF или собственные мета-поля с валидированным содержимым.
- Используйте
wp_ksesс кастомным набором разрешённых тегов, если нужна фильтрация без удаления всех HTML.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Удаление wpautop | Простое отключение автоматических <p> и <br> | Может повлиять на все посты, сломать форматирование | Использовать выборочно для WooCommerce, с приоритетом |
Удаление wp_kses_post | Позволяет выводить любой HTML | Опасно с точки зрения безопасности | Только для доверенного контента |
Фильтр woocommerce_product_get_description | Гибкое управление выводом описания | Требуются знания хуков WooCommerce | Оптимальный вариант для кастомизации |
Чек-лист для отключения автоматического преобразования HTML в WooCommerce
- Проверить, как выводится HTML в описании товара
- Добавить
remove_filter('the_content', 'wpautop')и проверить результат - Добавить
remove_filter('woocommerce_short_description', 'wpautop') - Отключить фильтрацию
wp_kses_postдля нужных полей - Использовать фильтр
woocommerce_product_get_descriptionдля чистого вывода - Проверить вывод на фронтенде и в инспекторе браузера
- Убедиться в безопасности вводимого HTML