Диагностика задачи: почему нужно менять отображение цен
В стандартном WooCommerce цена товара выводится в простом формате без учета специфики бизнеса. Часто возникает необходимость кастомизировать отображение цен: добавить валютный символ, показать скидки или сделать динамический текст в зависимости от статуса товара. Чтобы не править шаблоны напрямую, лучше использовать хуки WooCommerce, которые позволяют безопасно и гибко модифицировать вывод.
Основные хуки для изменения отображения цен в WooCommerce
WooCommerce предоставляет несколько хуков для изменения отображения цены, основные из них:
woocommerce_get_price_html— фильтр для изменения HTML вывода цены.woocommerce_before_calculate_totals— действие для изменения цены в корзине перед подсчетом.woocommerce_cart_item_price— фильтр для изменения цены товара в корзине.
В этой статье сосредоточимся на фильтре woocommerce_get_price_html для изменения вывода цены на странице товара и в каталоге.
Пошаговое решение: добавление текста «Цена по акции» перед ценой товаров со скидкой
Задача — добавить перед ценой товара текст «Цена по акции:», если на товар установлена скидка.
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
add_filter('woocommerce_get_price_html', 'custom_sale_price_prefix', 10, 2);
function custom_sale_price_prefix($price_html, $product) {
if ($product->is_on_sale()) {
$price_html = '<span class="sale-prefix">Цена по акции: </span>' . $price_html;
}
return $price_html;
}Этот код проверяет, есть ли скидка у товара ($product->is_on_sale()), и добавляет префикс к цене.
Проверка результата
- Перейдите на страницу товара, на который установлена скидка.
- Проверьте, что перед ценой появился текст «Цена по акции:».
- Если используется кэширование, очистите кэш и обновите страницу.
- Для товаров без скидки префикс не должен отображаться.
Частые ошибки и их исправление
- Префикс появляется на всех товарах, включая без скидки: Проверьте, что проверка
$product->is_on_sale()корректна и объект$product— это экземплярWC_Product. Если фильтр вызывается в нестандартном контексте, объект может быть другим. - Код не работает — цена не меняется: Убедитесь, что ваш код не конфликтует с другими плагинами, которые тоже меняют цену. Попробуйте увеличить приоритет фильтра, например, на 20.
- HTML выводится некорректно: Проверьте, что используете правильные кавычки и экранируете HTML, если необходимо. В нашем случае добавление
<span>безопасно.
Расширенный пример: добавление кастомного текста после цены для всех товаров в каталоге
add_filter('woocommerce_get_price_html', 'add_custom_text_after_price', 15, 2);
function add_custom_text_after_price($price_html, $product) {
// Добавим текст только в архиве товаров
if (is_shop() || is_product_category()) {
$price_html .= ' <small>— доставка бесплатно</small>';
}
return $price_html;
}Этот код добавит подвал с информацией о бесплатной доставке после цены на страницах магазина и категорий.
Чек-лист для успешного изменения отображения цен через хуки
- Проверить, что фильтр подключен через
add_filterс правильным приоритетом. - Убедиться, что объект
$productвалиден и поддерживает методы WooCommerce. - Тестировать изменения на разных типах товаров (простые, вариативные, со скидкой).
- Проверить совместимость с кэш-плагинами и очистить кэш после изменений.
- Использовать дочернюю тему или кастомный плагин, чтобы не потерять изменения при обновлении WooCommerce.
Практические советы по безопасности и производительности
- Не используйте тяжелые вычисления внутри фильтров вывода цены — это замедлит загрузку страниц.
- Проверяйте входные данные и избегайте прямого вывода пользовательского контента без экранирования.
- Для сложной логики лучше использовать кеширование или transient API.
- Избегайте изменения цен напрямую через хуки без явной необходимости — это может нарушить логику подсчета в корзине и заказах.
Таблица сравнения способов изменения отображения цен в WooCommerce
| Способ | Плюсы | Минусы | Пример использования |
|---|---|---|---|
Фильтр woocommerce_get_price_html | Легко изменить вывод HTML цены без правки шаблонов | Не меняет реальные цены в корзине | Добавление текста "Цена по акции:" |
Хук woocommerce_before_calculate_totals | Изменяет цену товара в корзине и заказе | Сложнее в реализации, может влиять на расчеты | Динамическая скидка по условию |
| Правка шаблонов в теме | Полный контроль над выводом | Сложнее обновлять, риск потери изменений при апдейте | Полная кастомизация дизайна цены |