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

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

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

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

Как работает изменение цены товара в WooCommerce через хуки

Цены товаров в WooCommerce можно изменять динамически с помощью фильтра woocommerce_get_price или woocommerce_product_get_price (для последних версий WooCommerce). Для изменения цены именно при применении купона нужно отследить активный купон и в зависимости от его кода возвращать новую цену товара.

Пошаговое решение

  1. Определить код купона, при котором меняется цена.
  2. Добавить фильтр для изменения цены товара при расчёте.
  3. Проверить, что купон применён.
  4. Изменить цену для нужного товара.

Пример кода для functions.php темы или собственного плагина

add_filter('woocommerce_product_get_price', 'custom_price_by_coupon', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'custom_price_by_coupon', 10, 2);

function custom_price_by_coupon($price, $product) {
    if (is_admin()) return $price; // Не изменять в админке

    // Получаем применённые в корзине купоны
    if (WC()->cart) {
        $applied_coupons = WC()->cart->get_applied_coupons();

        // Проверяем, есть ли нужный купон
        if (in_array('specialdiscount', $applied_coupons)) {
            // Проверяем ID или SKU товара, цену которого хотим изменить
            if ($product->get_id() == 123) { // замените 123 на ID вашего товара
                $new_price = 500; // новая цена
                return $new_price;
            }
        }
    }
    return $price;
}

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

  • Добавьте в WooCommerce купон с кодом specialdiscount, который покупатель может применить.
  • Добавьте в корзину товар с ID 123 (можно узнать через админку WooCommerce).
  • Перейдите в корзину и примените купон.
  • Проверьте, что цена товара в корзине изменилась на 500 (или другую заданную в коде).
  • Если цена не поменялась, проверьте, что фильтр подключён, а ID товара и код купона указаны правильно.

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

  • Неправильный ID товара: Используйте var_dump($product->get_id()) в отладочном режиме или посмотрите ID товара в админке WooCommerce.
  • Купон не применяется: Убедитесь, что в корзине активен нужный купон. Можно вывести var_dump(WC()->cart->get_applied_coupons()) для отладки.
  • Изменение цены не происходит в админке: Функция специально пропускает админку через is_admin() для предотвращения конфликтов.
  • Кеширование: Если установлен кеш, цены могут не обновляться сразу. Очистите кеш WooCommerce и браузера.

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

  • Не меняйте цену товара глобально – фильтр должен срабатывать только при активной корзине и применённом купоне, чтобы избежать ошибок на странице товара и в админке.
  • Для повышения производительности избегайте сложных запросов в фильтре, лучше кэшируйте результаты, если цена зависит от внешних данных.
  • Используйте ID товара, а не название или SKU, чтобы избежать конфликтов при смене метаданных.

Сравнение подходов: плагин против кастомного кода

ПодходПлюсыМинусыКогда использовать
Готовый плагин (например, Dynamic Pricing)Быстро, много функций, поддержкаПлатный, может нагрузить сайт, часто избыточный функционалЕсли нужно много правил и удобный интерфейс
Кастомный код (фильтр цены + проверка купона)Точно под задачу, легковесно, бесплатноТребует навыков разработки, ограниченный функционалДля простой логики изменения цены при конкретных купонах
Как закрыть дубли страниц от индексации в WordPress без поломки SEO
22.08.2026