Проблема: как автоматически снижать цену товара при использовании купона в 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 и браузера.
Пошаговое руководство по внедрению
- Создайте купон в WooCommerce в разделе Маркетинг > Купоны.
- Определите ID товара, цену которого хотите менять (через админку или в URL продукта).
- Добавьте приведённый выше PHP-код в файл
functions.phpвашей дочерней темы или в свой плагин. - Замените
special10и123на свои значения. - Проверьте работу на фронтенде — добавьте товар, примените купон, проверьте цену.
Проверка результата
Для проверки используйте консоль браузера и логи WooCommerce:
- Убедитесь, что в корзине цена товара изменилась.
- Посмотрите, что итоговая сумма заказа пересчиталась.
- Проверьте, что в админке заказ отображается с правильной ценой.
Практические советы по безопасности и производительности
- Избегайте выполнения этой логики в админке и AJAX-запросах, чтобы не нагружать сервер лишними операциями.
- Используйте проверку купонов по коду, а не по названию, чтобы избежать ошибок.
- Если у вас много товаров с разной логикой, лучше сделать массив с ID и процентами скидок, чтобы код был масштабируемым.
Сравнение способов изменения цены при купонах
| Метод | Плюсы | Минусы |
|---|---|---|
| Использование стандартных скидок купонов WooCommerce | Простота, не требует кода | Нет динамического изменения цены отдельного товара |
Код на хуке woocommerce_before_calculate_totals | Гибкость, контроль цены каждого товара | Требует кода, может быть сложнее поддерживать |
| Плагины для продвинутых скидок | Много функций, удобный интерфейс | Стоимость, нагрузка, возможные конфликты |