Проблема: как автоматически менять цену товара при запуске акции в WooCommerce
В интернет-магазинах на WooCommerce часто возникает задача: при запуске акции или распродажи нужно автоматически изменять цену товара, не затрагивая основную цену в базе, чтобы сохранить историю и корректно отображать скидки. Ручное изменение цены неудобно при большом каталоге, а стандартные возможности WooCommerce по акции не всегда подходят для кастомных сценариев.
Диагностика задачи
Если вы хотите, чтобы при активации акции цена товара автоматически уменьшалась по заданному правилу, например, на 10%, 15% или до фиксированной цены, стоит проверить:
- Используется ли стандартное поле «Старая цена» (sale_price) для отображения скидки?
- Поддерживает ли тема и плагин кэширование динамические изменения цен?
- Не конфликтуют ли другие плагины с изменением цены?
Без правильной реализации код может работать нестабильно или цены не обновляться на фронте.
Пошаговое решение: автоматическое изменение цены товара при акции
1. Используем фильтр woocommerce_get_price для динамического изменения цены
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
add_filter('woocommerce_get_price', 'custom_dynamic_sale_price', 10, 2);
function custom_dynamic_sale_price($price, $product) {
// Проверяем, что товар в наличии и акция активна
if (!$product->is_on_sale() && $product->is_in_stock()) {
$regular_price = floatval($product->get_regular_price());
// Например, скидка 15%
$discount = 0.15;
$new_price = $regular_price * (1 - $discount);
return round($new_price, 2);
}
return $price;
}Этот код будет динамически возвращать цену с 15% скидкой, если товар не на распродаже. Вы можете менять логику условия.
2. Обновление цены на странице товара и в каталоге
Фильтр woocommerce_get_price применяется везде, где WooCommerce выводит цену, так что цена будет изменена и на странице товара, и в списках.
3. Использование пользовательского поля для активации акции
Если нужно включать акцию выборочно, добавьте произвольное поле для товара, например enable_dynamic_sale. Тогда в коде добавьте проверку:
if (get_post_meta($product->get_id(), 'enable_dynamic_sale', true) === 'yes') {
// логика скидки
}Проверка результата после внедрения
- Откройте страницу товара и убедитесь, что цена изменилась согласно логике (например, уменьшилась на 15%).
- Проверьте страницу каталога, чтобы скидка отображалась во всех списках товаров.
- Проверьте, что в админке цена товара осталась без изменений (регулярная цена не затронута).
- Очистите кеш плагинов и браузера, чтобы не видеть устаревшие данные.
Частые ошибки и их исправление
- Цена не меняется на фронте: возможно, включено кеширование на уровне сервера или плагина. Очистите кеш.
- Цена меняется и в админке: фильтр влияет только на отображение, но если используете другие хуки или изменяете цену напрямую, это может сломать данные.
- Конфликт с плагинами скидок: убедитесь, что другие скидочные плагины не переопределяют цену после вашего фильтра. Порядок приоритетов в фильтрах влияет.
- Неправильное округление: используйте
round($new_price, 2)для корректного отображения цен.
Практические советы по безопасности и производительности
- Используйте минимальное количество тяжелых операций в фильтрах цен, так как они вызываются очень часто.
- Если скидка зависит от внешних условий, кешируйте результаты, чтобы не нагружать сервер.
- Не изменяйте данные продуктов напрямую в фильтрах цены, чтобы избежать ошибок в отчетах и заказах.
Сравнение подходов для изменения цены при акции
| Метод | Плюсы | Минусы |
|---|---|---|
Использование фильтра woocommerce_get_price | Динамическая цена без изменения базы, легко отключить | Может конфликтовать с кэшем, требует опытного кода |
Изменение sale_price в админке вручную | Стандартный функционал, поддерживается WooCommerce | Ручная работа, неудобно при большом каталоге |
| Плагины скидок и акций | Готовые решения с расширенным функционалом | Могут быть тяжелыми, не всегда подходят под кастомные задачи |