Почему нужно автоматически изменять цены при акциях в WooCommerce
В интернет-магазинах часто возникают задачи по динамическому изменению цен на товары при проведении акций или распродаж. Встроенные возможности WooCommerce позволяют задавать скидки через купоны или специальные поля "Цена со скидкой", но эти методы не всегда удобны для массового или условного обновления цен без плагинов.
Автоматизация позволит быстро и централизованно менять цены товаров, например, делать скидку 10% на все товары определённой категории или автоматически менять цену при определённых условиях, не трогая вручную каждый товар.
Диагностика задачи: когда и как менять цены автоматически
Перед реализацией нужно понять:
- По каким критериям менять цены: категория товара, тег, дата, количество в корзине, пользовательская роль.
- Как именно менять — фиксированная скидка, процент, новая цена.
- Как долго действует акция — временные рамки для автоматического включения и выключения скидок.
Пример: скидка 15% на все товары из категории "Обувь" с 1 по 10 июля.
Пошаговое решение: реализация автоматического изменения цены через фильтр
WooCommerce позволяет менять цену товара на лету с помощью фильтра woocommerce_get_price или woocommerce_product_get_price. Это значит, что не нужно менять цены в базе — достаточно динамично подменять выводимую цену.
Пример кода для применения скидки 15% на товары из категории "obuv":
add_filter('woocommerce_product_get_price', 'custom_discount_on_category', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_discount_on_category', 10, 2);
function custom_discount_on_category($price, $product) {
if ( ! is_admin() ) { // Чтобы не влиять на админку
$category_slug = 'obuv';
$start_date = strtotime('2024-07-01');
$end_date = strtotime('2024-07-10');
$now = time();
if ($now >= $start_date && $now <= $end_date && has_term($category_slug, 'product_cat', $product->get_id())) {
$discount = 0.15; // 15%
$new_price = $price * (1 - $discount);
return round($new_price, 2);
}
}
return $price;
}Этот код подключается в файл functions.php вашей темы или в собственный плагин. Он проверяет, что текущая дата попадает в диапазон акции, и если товар принадлежит к категории «obuv», то цена уменьшается на 15%.
Почему фильтруем и регулярную, и текущую цену
Чтобы WooCommerce корректно отображал цену и расчет скидок, нужно менять как обычную цену, так и регулярную. Иначе могут возникать ошибки в выводе или расчётах.
Проверка результата
1. Зайдите на страницу товара из категории "obuv" в публичной части сайта в период действия акции (1-10 июля). Цена должна быть ниже на 15% от обычной.
2. В админке цены останутся без изменений, что безопасно и позволяет легко отменить акцию.
3. Чтобы проверить работу кода в любой момент, временно измените даты акции на текущие и обновите страницу товара.
4. Для отладки добавьте временно вывод error_log внутри функции, например:
error_log('Original price: ' . $price . ', discounted price: ' . $new_price);Частые ошибки и их исправление
- Скидка не применяется: Проверьте, что slug категории указан правильно, и что товары действительно принадлежат этой категории.
- Цена меняется в админке: Убедитесь, что в коде есть проверка
if ( ! is_admin() ), чтобы фильтр не влиял на административную часть. - Проблемы с кэшированием: Если используется кэш, скидка может не обновляться мгновенно. Очистите кэш и попробуйте снова.
- Вычисление цены некорректно округляется: Используйте
round()для точного вывода цены с нужным количеством знаков.
Практические советы по безопасности и производительности
- Не меняйте цены в базе данных напрямую для акций — это риски и неудобства. Используйте фильтры WooCommerce.
- Ограничьте проверки условия по дате и категории, чтобы не нагружать сервер лишними вычислениями.
- Добавьте проверку
is_admin(), чтобы отключать фильтр в админке и избежать путаницы. - Для больших магазинов с тысячами товаров рассмотрите возможность кэшировать результаты вычислений скидок.
- Тестируйте работу на staging-сайте, чтобы избежать сбоев на живом ресурсе.
Сравнение способов реализации автоматических скидок
| Метод | Плюсы | Минусы |
|---|---|---|
| Фильтр цены в коде (как в статье) | Гибко, не требует плагинов, безопасно для базы | Требует навыков программирования, может влиять на производительность при больших объёмах |
| Плагины для скидок (например, WooCommerce Dynamic Pricing) | Много опций, удобный интерфейс | Добавляют нагрузку, могут конфликтовать, требуют обновлений |
| Ручное изменение цен через CSV импорт | Контроль над ценами, массовое обновление | Риск ошибок, неудобство при частых акциях |