Диагностика проблемы: почему стандартные скидки WooCommerce не подходят
В WooCommerce есть встроенные механизмы скидок: купоны, распродажи, акции через плагин "Акции и скидки" и т.д. Но часто требуется более гибкий и автоматизированный подход: например, автоматически менять цену товара на акционную при наступлении определённого периода или по другим критериям, без ручного редактирования каждого товара. Стандартные функции не позволяют сделать это без дополнительных плагинов или кастомного кода.
Проверить, что текущие инструменты не подходят, можно так:
- В админке WooCommerce проверьте, можно ли задать период действия скидки через стандартный функционал (обычно нет).
- Проверьте, есть ли необходимость менять цену не только для отображения, но и для итоговой суммы заказа (что не всегда делает плагин акции).
- Убедитесь, что скидка должна применяться автоматически, без участия клиента.
Пошаговое решение: как программно менять цену товаров по акции
1. Создаём функцию для изменения цены при выводе
Используем хук woocommerce_product_get_price и woocommerce_product_get_sale_price, чтобы динамически менять цену товара в зависимости от даты и других условий.
add_filter('woocommerce_product_get_price', 'custom_sale_price_auto', 10, 2); add_filter('woocommerce_product_get_sale_price', 'custom_sale_price_auto', 10, 2); function custom_sale_price_auto($price, $product) { $product_id = $product->get_id(); $current_date = current_time('Y-m-d'); // Задаём даты акции $sale_start = '2024-07-01'; $sale_end = '2024-07-10'; if ($current_date >= $sale_start && $current_date <= $sale_end) { // Вычисляем акционную цену, например 20% скидка $regular_price = $product->get_regular_price(); $discount_price = $regular_price * 0.8; return $discount_price; } return $price; }2. Обновляем цену в корзине и при оформлении заказа
Чтобы цена корректно считалась в корзине, используем хук woocommerce_before_calculate_totals:
add_action('woocommerce_before_calculate_totals', 'custom_cart_item_price_auto', 10, 1); function custom_cart_item_price_auto($cart) { if (is_admin() && !defined('DOING_AJAX')) return; $current_date = current_time('Y-m-d'); $sale_start = '2024-07-01'; $sale_end = '2024-07-10'; if ($current_date >= $sale_start && $current_date <= $sale_end) { foreach ($cart->get_cart() as $cart_item) { $product = $cart_item['data']; $regular_price = $product->get_regular_price(); $discount_price = $regular_price * 0.8; $cart_item['data']->set_price($discount_price); } } }Проверка результата после внедрения
Чтобы проверить, что автоматическое изменение цены работает:
- Установите системную дату сервера или используйте фильтр для временной подмены
current_timeна дату внутри периода акции. - Посетите страницу товара — цена должна отображаться с учётом скидки (например, 20% ниже обычной).
- Добавьте товар в корзину, перейдите к оформлению заказа — везде должна отображаться акционная цена.
- После окончания периода акции цена должна возвращаться к обычной.
Частые ошибки и как их исправить
- Цена не меняется в корзине: проверьте, что функция для корзины подключена через
woocommerce_before_calculate_totalsи что в ней корректно устанавливается цена черезset_price(). - Цена меняется, но итог заказа неверный: убедитесь, что нет конфликтов с другими плагинами, которые могут переопределять цены в корзине.
- Функция не срабатывает на вариативных товарах: для вариативных товаров нужно менять цену вариаций, а не главного продукта. Можно добавить проверку типа товара и менять цену через
$product->get_children(). - Период акции не учитывается корректно: проверьте формат дат и часовой пояс сервера/WordPress (функция
current_time('Y-m-d')возвращает дату в часовом поясе WP).
Практические советы по безопасности и производительности
- Код лучше размещать в дочерней теме или собственном плагине, чтобы избежать потери изменений при обновлении.
- Не используйте слишком сложную логику в хуках, чтобы не замедлять загрузку страниц и корзины.
- Для масштабных акций с большим количеством товаров лучше использовать кэширование и проверять нагрузку.
- Тестируйте изменения на staging-сайте перед продакшн.
Сравнение вариантов решения автоматических цен в WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Стандартные акции WooCommerce | Простота настройки, нет кода | Нет гибкости по времени, нельзя автоматизировать сложные условия | Простые скидки и распродажи |
| Плагины акций (например, Advanced Coupons) | Много функций, удобный интерфейс | Дополнительная нагрузка, платные версии | Комплексные маркетинговые акции |
| Кастомный код (как в статье) | Полный контроль, гибкость, бесплатно | Требуется знание PHP и WooCommerce API | Узкоспециализированные автоматизации и интеграции |