WooCommerce: автоматическое изменение цен по акции с помощью кода

Диагностика проблемы: почему стандартные скидки 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 Узкоспециализированные автоматизации и интеграции
WooCommerce: решение проблемы с не обновляющейся корзиной после добавления товара
28.05.2026
Как оптимизировать загрузку изображений в WordPress для ускорения сайта
10.12.2025
WooCommerce: автоматическое изменение цен по акции с помощью кода
16.05.2026
Как создать собственный шорткод в WordPress
01.11.2025
WooCommerce: решение проблемы с отключёнными платёжными системами
06.05.2026