Диагностика задачи: почему нужно автоматическое изменение стоимости
В интернет-магазинах на WooCommerce часто возникает необходимость временно снижать цены на товары при проведении акций или распродаж. Встроенные возможности WooCommerce позволяют делать скидки вручную или через распродажные цены, но при большом ассортименте и частых акциях это неудобно и подвержено ошибкам.
Автоматизация изменения цен при акциях позволяет:
- Избежать ошибок ручного ввода цен;
- Ускорить процесс подготовки акций;
- Обеспечить единообразие скидок;
- Гибко управлять условиями скидок через код.
Как работает автоматическое изменение цен в WooCommerce через код
Основная идея — перехватывать вывод цены товара и динамически изменять её в зависимости от условий акции (например, дата, категория товара, пользовательская роль и т.п.). Для этого используется хук woocommerce_get_price_html или фильтр woocommerce_product_get_price.
Рассмотрим пример кода, который применяет 20% скидку на все товары из категории "Распродажа" в период с 1 по 10 июля 2024 года.
Пример кода для автоматической скидки
add_filter('woocommerce_product_get_price', 'auto_discount_price', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'auto_discount_price', 10, 2);
add_filter('woocommerce_get_price_html', 'auto_discount_price_html', 10, 2);
function auto_discount_price($price, $product) {
// Проверяем дату акции
$start = strtotime('2024-07-01');
$end = strtotime('2024-07-10');
$now = time();
if ($now < $start || $now > $end) {
return $price; // вне периода акции
}
// Проверяем, что товар в нужной категории
if (has_term('rasprodazha', 'product_cat', $product->get_id())) {
$discount = 0.2; // 20% скидка
return round($price * (1 - $discount), 2);
}
return $price;
}
function auto_discount_price_html($price_html, $product) {
$start = strtotime('2024-07-01');
$end = strtotime('2024-07-10');
$now = time();
if ($now < $start || $now > $end) {
return $price_html;
}
if (has_term('rasprodazha', 'product_cat', $product->get_id())) {
$regular_price = wc_price($product->get_regular_price());
$discounted_price = wc_price(auto_discount_price($product->get_regular_price(), $product));
return '<del>' . $regular_price . '</del> <ins>' . $discounted_price . '</ins>';
}
return $price_html;
}
Пошаговое внедрение решения
- Добавьте код в файл
functions.phpактивной темы или в собственный плагин. - Убедитесь, что в вашей товарной категории есть категория с ярлыком (slug)
rasprodazhaи товары в ней. - Настройте даты акции, изменив переменные
$startи$endв форматеYYYY-MM-DD. - Очистите кэш сайта и браузера, если используется кэширование.
- Проверьте отображение цен на странице товаров из категории "Распродажа" в указанный период.
Проверка результата после внедрения
- Откройте страницу товара из категории "Распродажа" в период действия акции. Цена должна отображаться с зачёркнутой старой ценой и новой — с учётом скидки.
- Проверьте корзину — цены должны соответствовать скидочным.
- Вне периода акции цены должны отображаться без изменений.
- Для товаров вне категории скидка не применяется.
Частые ошибки и как их исправить
- Не изменяется цена на странице товара или в корзине: Возможно, вы используете кэширование или плагин оптимизации, который кеширует цены. Очистите кэш и отключите оптимизации для проверки.
- Скидка применяется ко всем товарам: Проверьте, что в коде правильно указан ярлык категории
rasprodazha. Ошибка в slug приводит к неправильной фильтрации. - Ошибка формата цены или некорректное округление: Для правильного отображения используйте функцию
wc_price()иround()с двумя знаками после запятой. - Скидка не видна в виджетах или списках товаров: Фильтр
woocommerce_get_price_htmlдолжен быть применён, чтобы менять отображение цены везде.
Практические советы по безопасности и производительности
- Не используйте тяжелые запросы в функциях изменения цены — проверяйте категории через
has_term, это достаточно быстро. - Избегайте прямого изменения данных в базе — все изменения должны быть на уровне отображения (фильтры), чтобы не нарушать целостность данных.
- При большом количестве товаров и сложных условиях скидок рассмотрите кэширование результатов вычислений или использование transient API.
- Тестируйте код на staging-сайте, чтобы не допустить ошибок на продакшене.
Сравнение вариантов реализации автоматических скидок
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код на хуках (как в статье) | Полный контроль, нет нагрузки на базу, бесплатно | Требует навыков, ограниченная гибкость без доработок |
| Плагины для скидок (например, WooCommerce Dynamic Pricing) | Готовые решения, удобный UI, много функций | Платные, могут тормозить сайт, конфликтовать с другими плагинами |
| Ручное выставление скидок в админке WooCommerce | Просто использовать, без кода | Не подходит для больших каталогов и частых акций |