Автоматическое изменение цены товара в WooCommerce при использовании купонов

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

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

Диагностика задачи

Часто нужно, чтобы при активации купона цена товара автоматически менялась, например, снижалась до фиксированной суммы или уменьшалась на определённый процент, но не просто скидка к корзине в целом.

Проверяем, что стандартное применение купона не меняет цену товара напрямую:

add_action('woocommerce_before_calculate_totals', function($cart) {
    foreach ($cart->get_cart() as $item) {
        error_log('Price before: ' . $item['data']->get_price());
    }
});

Если в логах цена не меняется при применении купона, значит нужна кастомная логика.

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

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

add_action('woocommerce_before_calculate_totals', 'custom_discount_price_on_coupon', 20, 1);
function custom_discount_price_on_coupon($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    // Проверяем, применён ли нужный купон
    $target_coupon_code = 'special10'; // Замените на код вашего купона
    $applied_coupons = WC()->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; // замените на ID вашего товара
        if ($cart_item['product_id'] == $target_product_id) {
            $original_price = $cart_item['data']->get_regular_price();
            // Новая цена, например, 10% скидка
            $new_price = $original_price * 0.9;
            $cart_item['data']->set_price($new_price);
        }
    }
}

Этот код проверяет, что купон с кодом special10 применён, и для товара с ID 123 меняет цену на 90% от оригинала.

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

  • Создайте купон с кодом special10 в WooCommerce.
  • Добавьте товар с ID 123 в корзину.
  • Примените купон в корзине.
  • Убедитесь, что цена товара изменилась на 10% вниз в корзине и оформлении заказа.

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

  • Цена не меняется при применении купона: Проверьте, что код купона точно совпадает с тем, который вы проверяете в коде.
  • Цена меняется для всех товаров: Убедитесь, что фильтр применяется только к нужному продукту, проверяя $cart_item['product_id'].
  • Изменение цены влияет на админку или AJAX: добавьте проверку if (is_admin() && !defined('DOING_AJAX')) return; чтобы избежать конфликтов.
  • Кэширование не даёт увидеть изменения: Очистите кэш WooCommerce и браузера.

Пошаговое руководство по внедрению

  1. Создайте купон в WooCommerce в разделе Маркетинг > Купоны.
  2. Определите ID товара, цену которого хотите менять (через админку или в URL продукта).
  3. Добавьте приведённый выше PHP-код в файл functions.php вашей дочерней темы или в свой плагин.
  4. Замените special10 и 123 на свои значения.
  5. Проверьте работу на фронтенде — добавьте товар, примените купон, проверьте цену.

Проверка результата

Для проверки используйте консоль браузера и логи WooCommerce:

  • Убедитесь, что в корзине цена товара изменилась.
  • Посмотрите, что итоговая сумма заказа пересчиталась.
  • Проверьте, что в админке заказ отображается с правильной ценой.

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

  • Избегайте выполнения этой логики в админке и AJAX-запросах, чтобы не нагружать сервер лишними операциями.
  • Используйте проверку купонов по коду, а не по названию, чтобы избежать ошибок.
  • Если у вас много товаров с разной логикой, лучше сделать массив с ID и процентами скидок, чтобы код был масштабируемым.

Сравнение способов изменения цены при купонах

МетодПлюсыМинусы
Использование стандартных скидок купонов WooCommerceПростота, не требует кодаНет динамического изменения цены отдельного товара
Код на хуке woocommerce_before_calculate_totalsГибкость, контроль цены каждого товараТребует кода, может быть сложнее поддерживать
Плагины для продвинутых скидокМного функций, удобный интерфейсСтоимость, нагрузка, возможные конфликты
Как создать свой плагин для автообновлений WordPress
01.03.2026
Как создать автоматический экспорт постов в WordPress с примерами кода и плагинами
05.03.2026
WooCommerce: автоматическое изменение ставки налога при разных условиях
07.07.2026
Автоматическое изменение цены товара в WooCommerce при использовании купонов
13.07.2026
WooCommerce: автоматическое изменение цены продукта при добавлении в корзину
30.05.2026