Диагностика задачи: зачем нужна автоматизация изменения цен в WooCommerce
В WooCommerce часто возникает необходимость динамически менять цены товаров при проведении акций — скидки на группы товаров, временные распродажи или специальные предложения. Ручное изменение цен неудобно и рискованно при большом каталоге. Автоматизация позволяет централизованно управлять скидками без плагинов, снижая нагрузку на базу и минимизируя ошибки.
Пошаговое решение: как программно изменить цены товаров при акциях
1. Используем хук woocommerce_get_price для динамической подмены цены
Этот фильтр позволяет изменить цену товара в реальном времени при выводе на фронтенде и в админке. Код ниже применяет скидку 20% для всех товаров из категории "sale" в течение заданного периода.
add_filter('woocommerce_get_price', 'apply_sale_discount', 10, 2);
function apply_sale_discount($price, $product) {
if (!is_admin()) {
$sale_cat = 'sale'; // slug категории для акции
// Проверяем дату акции
$start_date = strtotime('2024-06-01 00:00:00');
$end_date = strtotime('2024-06-15 23:59:59');
$now = current_time('timestamp');
if ($now >= $start_date && $now <= $end_date) {
if (has_term($sale_cat, 'product_cat', $product->get_id())) {
// Применяем скидку 20%
$price = $price * 0.8;
}
}
}
return $price;
}2. Обработка вариативных товаров
Для вариативных товаров нужно использовать фильтр woocommerce_variation_prices_price, чтобы скидка корректно применялась к варьациям:
add_filter('woocommerce_variation_prices_price', 'apply_sale_discount_variations', 10, 3);
function apply_sale_discount_variations($price, $variation, $product) {
$sale_cat = 'sale';
$start_date = strtotime('2024-06-01 00:00:00');
$end_date = strtotime('2024-06-15 23:59:59');
$now = current_time('timestamp');
if ($now >= $start_date && $now <= $end_date) {
if (has_term($sale_cat, 'product_cat', $product->get_id())) {
$price = $price * 0.8;
}
}
return $price;
}Как проверить, что автоматическое изменение цен работает
- Откройте страницу товара, относящегося к категории "sale" в период действия акции.
- Сравните цену с обычной ценой в админке (в карточке товара).
- Проверьте, что скидка не применяется вне периода акции.
- Для вариативных товаров убедитесь, что у каждой вариации цена снижена.
- Проверьте корзину и оформление заказа — цены должны быть уже со скидкой.
Частые ошибки и как их исправить
- Скидка не применяется: проверьте, что slug категории совпадает и товары действительно принадлежат к ней.
- Скидка применяется в админке: в фильтре отключен возврат цены в админке через проверку
!is_admin(), убедитесь, что условие не удалено. - Цена варьаций не меняется: добавьте фильтр
woocommerce_variation_prices_price, так какwoocommerce_get_priceне всегда срабатывает для вариаций. - Проблемы с кешированием: отключите кеширование страницы или настройте кеш так, чтобы цены обновлялись динамически.
Практические советы по производительности и безопасности
- Не меняйте цены в базе данных напрямую, чтобы избежать рассинхронизации и потери истории цен.
- Используйте кеширование с осторожностью — динамические цены лучше не кешировать на уровне страницы.
- Проверяйте нагрузку на сервер при большом каталоге — фильтры вызываются при каждом запросе цены.
- Для сложных акций лучше использовать отдельные таблицы или мета-данные с кешированием результатов.
Сравнение подходов: плагин или кастомный код
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Плагин (например, WooCommerce Dynamic Pricing) | Готовое решение, много настроек, поддержка | Нагрузка на сайт, зависимость от обновлений, платные версии | Использовать для сложных акций |
| Кастомный код (фильтры цен) | Легковесно, гибко, без лишних зависимостей | Требует поддержки, ограничена сложность правил | Подходит для простых и средних акций |