Автоматическое изменение цены товара в 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
14.04.2026
Автоматическое удаление IP из черного списка в WordPress по времени
27.12.2025
Удаление неиспользуемых ролей и их метаданных в WordPress
21.04.2026
Удаление старых файлов из медиабиблиотеки WordPress по расписанию
30.03.2026
Как создать свой плагин для автообновлений WordPress
01.03.2026