Диагностика проблемы: почему цены не меняются автоматически при акциях
В WooCommerce часто возникает задача автоматически менять цену товара при запуске акции, без необходимости вручную корректировать цену каждого продукта. Проблема усугубляется, если в магазине сотни товаров и акции регулярны. Стандартные скидки WooCommerce не всегда подходят для сложных условий, а сторонние плагины могут замедлять сайт.
Чтобы понять, почему цены не меняются автоматически, проверьте:
- Правильно ли настроены даты акции (акционные цены и даты начала/окончания акции в карточке товара).
- Используется ли кэширование, которое может блокировать обновление цен.
- Есть ли кастомные фильтры или функции, которые перезаписывают цены.
Пошаговое решение: создание автоматического изменения цен через хук WooCommerce
Реализуем логику автоматического изменения цены при акции программно — без плагинов. Для примера сделаем скидку 20% на все товары из определённой категории «sale» в заданный период.
1. Добавление фильтра для изменения цены товара
Добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:
add_filter('woocommerce_product_get_price', 'custom_sale_price_dynamic', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_sale_price_dynamic', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'custom_sale_price_dynamic', 10, 2);
function custom_sale_price_dynamic($price, $product) {
// Проверяем наличие категории 'sale'
if (has_term('sale', 'product_cat', $product->get_id())) {
$current_date = current_time('Y-m-d');
$start_date = '2024-07-01'; // дата начала акции
$end_date = '2024-07-15'; // дата окончания акции
if ($current_date >= $start_date && $current_date <= $end_date) {
// Применяем скидку 20%
$discounted_price = $price * 0.8;
return round($discounted_price, 2);
}
}
return $price;
}2. Поддержка отображения скидок и цен в корзине
Чтобы корректно отображалась скидка в корзине и на страницах оформления заказа, добавим фильтр для цены в заказах:
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_sale_price_cart', 10, 1);
function custom_dynamic_sale_price_cart($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
$current_date = current_time('Y-m-d');
$start_date = '2024-07-01';
$end_date = '2024-07-15';
if ($current_date < $start_date || $current_date > $end_date) return;
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (has_term('sale', 'product_cat', $product->get_id())) {
$original_price = $product->get_price();
$new_price = $original_price * 0.8;
$product->set_price(round($new_price, 2));
}
}
}Проверка результата после внедрения
Чтобы проверить, что скидка применяется корректно:
- Добавьте в категорию «sale» несколько товаров.
- Убедитесь, что дата сервера находится в периоде акции (либо временно измените даты в коде на текущие).
- Откройте карточку товара — цена должна отображаться со скидкой 20%.
- Добавьте товар в корзину — цена там также должна быть снижена.
- Оформите заказ и проверьте итоговую сумму.
Частые ошибки и как их исправить
- Скидка не отображается на страницах: возможно, кэширование сайта или браузера мешает обновлению. Очистите кэш.
- Цена не меняется в корзине: не добавлен фильтр
woocommerce_before_calculate_totalsили код добавлен некорректно. - Неверное определение категории: проверьте, что slug категории действительно «sale» и товары к ней привязаны.
- Скидка применяется всегда: проверьте формат дат и сравнения в коде, используйте
current_time('Y-m-d')для корректного сравнения.
Практические советы по безопасности и производительности
- Не используйте тяжелую логику в фильтрах получения цены — это влияет на скорость загрузки страниц.
- Кэшируйте даты начала и окончания акции, если они динамические, чтобы не читать их из базы каждый раз.
- Храните даты акции в настройках темы или в пользовательских опциях, чтобы не менять код при каждой акции.
- Для крупных магазинов с большим количеством товаров и сложными условиями скидок лучше рассмотреть специализированные плагины с поддержкой кеширования.
Сравнение вариантов реализации автоматической скидки
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Код в functions.php | Легковесно, без плагинов, гибко | Требует навыков, сложно масштабировать | Хорошо для небольших магазинов и простых условий |
| Специализированные плагины (например, WooCommerce Dynamic Pricing) | Много функций, удобный интерфейс | Добавляют нагрузку, требуют лицензий | Лучше для крупных проектов с частыми акциями |
| Ручное изменение цен в товарах | Простое решение без кода | Не масштабируется, много ручной работы | Подходит для редких акций и ограниченного числа товаров |