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

В чем состоит задача автоматического изменения цены товара по акции

В WooCommerce часто требуется менять цену товара динамически, например, при проведении акции или скидки, которые зависят от даты, категории товара или количества в корзине. Использование стандартных скидок в админке не всегда удобно, особенно если нужно реализовать сложную логику или автоматизировать процесс. В этой статье рассмотрим, как программно изменить цену товара во фронтенде и в корзине с помощью фильтров WooCommerce.

Диагностика проблемы: почему стандартные скидки не подходят

Пользователи сталкиваются с проблемами, когда:

  • Стандартные купоны и акции не позволяют задать сложные условия (например, скидка только на определённые вариации, или только при покупке от определённого количества).
  • Нужно изменить цену на лету, без создания дополнительных товаров или вариаций.
  • Скидка должна автоматически применяться при определённых условиях, без участия пользователя.

В таких случаях приходится использовать хуки WooCommerce для программного изменения цены товара.

Пошаговое решение: как изменить цену товара по акции через код

1. Используем фильтр woocommerce_get_price или woocommerce_product_get_price

Фильтры позволяют перехватить запрос цены товара и вернуть изменённое значение. Для динамической скидки удобнее использовать woocommerce_product_get_price, так как он срабатывает для объекта продукта.

2. Пример кода для скидки 20% на товары определённой категории при текущей дате акции

add_filter('woocommerce_product_get_price', 'custom_discounted_price', 10, 2);
function custom_discounted_price($price, $product) {
    // Проверяем дату акции
    $start_date = strtotime('2024-06-01');
    $end_date = strtotime('2024-06-10');
    $now = time();
    if ($now < $start_date || $now > $end_date) {
        return $price; // акция не активна
    }

    // Проверяем категорию товара
    if (has_term('sale-category', 'product_cat', $product->get_id())) {
        $discounted_price = $price * 0.8; // скидка 20%
        return round($discounted_price, 2);
    }

    return $price;
}

3. Применение скидки в корзине и на странице товара

Фильтр woocommerce_product_get_price действует на цену товара везде, включая страницу товара и корзину. Если нужно учесть цену для вариаций, добавьте аналогичный фильтр woocommerce_product_variation_get_price.

Проверка результата после внедрения

Чтобы убедиться, что скидка работает:

  • Откройте страницу товара из категории sale-category в период акции — цена должна быть уменьшена на 20%.
  • Добавьте товар в корзину — цена в корзине и в чекауте должна соответствовать изменённой цене.
  • Попробуйте товары из других категорий — цена не должна изменяться.
  • Вне периода акции цена должна отображаться без изменений.

Для отладки можно временно добавить error_log() с выводом цены и ID товара в файл debug.log.

Частые ошибки и как их исправить

  • Скидка не применяется: Проверьте, что имя категории указано правильно (без пробелов, в нижнем регистре). Используйте var_dump(has_term('sale-category', 'product_cat', $product->get_id())); для проверки.
  • Цена меняется, но в корзине возвращается исходная: Добавьте фильтр woocommerce_product_variation_get_price для вариаций, или используйте фильтр woocommerce_cart_item_price для корректировки цены в корзине.
  • Проблемы с кэшированием: Если используется плагин кэширования, очистите кэш после внесения изменений.
  • Округление цены: Используйте round($price, 2) для корректного отображения с двумя десятичными.

Практические советы по безопасности и производительности

  • Избегайте сложных запросов в хуках, чтобы не замедлять загрузку страниц.
  • Для больших магазинов лучше использовать transient API для кэширования рассчитанных цен на время акции.
  • Не храните логику скидок в админке напрямую, если есть сложные условия — лучше реализовать в коде с комментариями.
  • Проверяйте права доступа и корректность ID товара, чтобы избежать сбоев.

Сравнение вариантов реализации автоматических скидок

СпособПлюсыМинусыПример
Плагины скидокУдобный интерфейс, много настроекМогут грузить сайт, не всегда гибкиеWooCommerce Dynamic Pricing
Код через фильтрыПолный контроль, минимальный весТребует навыков разработкиПример выше
Использование купоновПростая реализацияПользователь должен ввести кодСтандарт WooCommerce
Автоматическое удаление неактивных заказов в WooCommerce по срокам
27.06.2026
WooCommerce: автоматическое удаление неактивных заказов через код
05.06.2026
WooCommerce: автоматическое отправление подтверждения заказа по email через код
16.06.2026
Как создать автоматический перевод постов WordPress с помощью AI
11.03.2026
Автоматизация управления памятью в WordPress: практические решения и примеры
12.04.2026