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

Диагностика проблемы: почему стандартные промокоды WooCommerce могут не покрыть сложные сценарии ценообразования

Стандартные промокоды WooCommerce позволяют применить скидки фиксированной суммы, процента или установить бесплатную доставку. Однако, когда требуется изменить цену конкретного товара динамически, например, установить новую цену или изменить цену в зависимости от условий, встроенный функционал ограничен. Для таких задач необходима доработка через хуки и фильтры.

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

1. Подключение к событию применения промокода

Используем хук woocommerce_before_calculate_totals для изменения цены товаров в корзине после применения купона.

2. Проверка наличия нужного промокода

Через объект корзины проверяем, активирован ли наш промокод.

3. Изменение цены товара

Изменяем цену товара с помощью метода $cart_item['data']->set_price().

add_action('woocommerce_before_calculate_totals', 'custom_change_price_on_coupon', 20, 1);
function custom_change_price_on_coupon($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    // Название промокода, который должен применяться
    $target_coupon_code = 'mydiscount';

    // Проверяем, есть ли этот промокод в корзине
    $applied_coupons = $cart->get_applied_coupons();
    if (!in_array($target_coupon_code, $applied_coupons)) return;

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        // ID товара, для которого меняем цену
        $target_product_id = 123;

        if ($cart_item['product_id'] == $target_product_id) {
            // Новая цена
            $new_price = 50; // например 50 рублей
            $cart_item['data']->set_price($new_price);
        }
    }
}

Как проверить, что решение сработало

  • Добавьте в WooCommerce купон с кодом mydiscount.
  • Добавьте в корзину товар с ID 123.
  • Перейдите в корзину и примените купон.
  • Цена товара должна измениться на 50 рублей.
  • Проверьте на фронтенде и в админке заказа — цена должна соответствовать новой.

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

  • Промокод не применяется или цена не меняется. Проверьте правильность использования точного кода купона и ID товара.
  • Цена меняется не для всех товаров. Убедитесь, что условие $cart_item['product_id'] == $target_product_id учитывает все нужные товары или вариации.
  • Изменение цены не сохраняется в заказе. Используйте стандартные методы WooCommerce для изменения цены, set_price() — правильный способ.
  • Изменение цены влияет на другие купоны. Добавьте проверки на конкретный промокод, чтобы исключить конфликты.
  • Изменение цены конфликтует с кешем. Очистите кеш WooCommerce и браузера, проверьте работу в режиме инкогнито.

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

  • Не допускайте прямое изменение цен в базе, используйте только set_price() в корзине — это безопасно и не ломает логику WooCommerce.
  • Проверяйте, что код не выполняется в административной части сайта без необходимости (используйте проверку is_admin() и DOING_AJAX).
  • Если вам нужно изменить цены для большого числа товаров, сделайте оптимизированные условия, чтобы не перегружать цикл в корзине.
  • Для более сложных сценариев используйте плагины, которые позволяют создавать условные скидки, например, WooCommerce Conditional Discounts.

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

МетодОписаниеПлюсыМинусы
Стандартные купоны WooCommerce Фиксированная скидка или процент на корзину или товар Простота, поддержка WooCommerce Ограниченные условия, нет гибких цен
Хук woocommerce_before_calculate_totals Изменение цены товара программно Гибкость, индивидуальные цены по купону Требует программирования, возможны ошибки
Плагины условных скидок Готовые решения с интерфейсом Удобство настройки, много функций Стоимость, нагрузка на сайт
Как автоматизировать удаление старых пустых категорий в WordPress
23.03.2026
Как автоматизировать создание и удаление черновиков в WordPress с помощью WP-Cron
10.04.2026
Как создать автоматические уведомления о обновлениях сайта в WordPress
30.03.2026
Как создать динамические таблицы в WordPress с помощью shortcode
10.12.2025
Как удалить неиспользуемые шорткоды в WordPress
07.12.2025