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

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

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

Основные признаки проблемы:

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

Как автоматически менять цену товара при применении купона в WooCommerce

Шаг 1. Определяем нужный купон и товар

Для начала нужно поймать событие, когда купон применяется, и проверить, что это именно тот купон (по коду). Далее — изменить цену товара непосредственно в корзине.

Шаг 2. Используем хук woocommerce_before_calculate_totals

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

add_action('woocommerce_before_calculate_totals', 'change_price_on_coupon', 20, 1);
function change_price_on_coupon( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;

    // Проверяем, применен ли нужный купон
    $coupon_code = 'SPECIALPRICE';
    $coupon_applied = false;
    foreach ( WC()->cart->get_applied_coupons() as $code ) {
        if ( strtolower( $code ) === strtolower( $coupon_code ) ) {
            $coupon_applied = true;
            break;
        }
    }

    if ( ! $coupon_applied ) return;

    // Проходим по товарам в корзине
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( $cart_item['product_id'] == 123 ) { // ID товара
            $new_price = 500; // Новая цена
            $cart_item['data']->set_price( $new_price );
        }
    }
}

Шаг 3. Добавляем уведомление для пользователя

Чтобы покупатель понимал, что цена изменилась из-за купона, можно добавить уведомление в корзину:

add_action( 'woocommerce_before_cart', 'show_coupon_price_change_notice' );
function show_coupon_price_change_notice() {
    if ( in_array( 'specialprice', WC()->cart->get_applied_coupons() ) ) {
        wc_print_notice( 'Цена на товар со специальным купоном изменена.', 'notice' );
    }
}

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

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

  1. Добавьте товар с ID 123 в корзину.
  2. Примените купон SPECIALPRICE в корзине.
  3. Обновите страницу корзины и проверьте, что цена товара изменилась на 500.
  4. Убедитесь, что уведомление об изменении цены отображается над корзиной.

Если цена не меняется, проверьте, что код вставлен в functions.php активной темы или в кастомный плагин, а также что ID товара и код купона указаны правильно.

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

  • Код не срабатывает: проверьте, что хук woocommerce_before_calculate_totals добавлен с правильным приоритетом и что функция подключена.
  • Цена меняется для всех товаров: убедитесь, что условие $cart_item['product_id'] == 123 правильно указывает нужный ID.
  • Скидка применяется, но итоговая сумма неверна: возможно, другие плагины или темы конфликтуют с изменением цены. Проверьте консоль ошибок и логи.
  • Уведомление не появляется: проверьте, что купон применяется и код для уведомления не содержит ошибок.

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

  • Используйте проверку is_admin() && ! defined( 'DOING_AJAX' ) для исключения выполнения кода в административной части, чтобы не замедлять админку.
  • Не изменяйте цену товара глобально, а только для текущей корзины — так не повредите данные в базе.
  • Проверяйте, что купон действительно применяется, чтобы не менять цену без причины.
  • Кэширование: если используете кэш, убедитесь, что динамические цены обновляются корректно, иначе клиент увидит неверную цену.

Сравнение вариантов реализации автоматической смены цены при купоне

МетодПреимуществаНедостатки
Код на хуке woocommerce_before_calculate_totalsГибкость, не требует сторонних плагинов, точечное изменение ценыТребует навыков кода, возможны конфликты с другими плагинами
Использование плагинов для динамических ценПростота настройки, визуальный интерфейсЧасто платные, может влиять на скорость сайта
Изменение цены через JavaScript на фронтендеЛегко реализовать, не требует PHPЦена меняется только визуально, итоговые расчеты не меняются
Как удалить ненужные meta данные WordPress с помощью кода
31.01.2026
Замена AJAX на Fetch API в WordPress Gutenberg
05.04.2026
Почему не работают купоны в WooCommerce и как это исправить
28.05.2026
Как создать динамический фильтр по метаданным в WordPress
22.03.2026
Динамические редиректы в WordPress по условиям
08.03.2026