Диагностика проблемы: почему нужно менять цену товара после применения купона
В стандартном WooCommerce купоны уменьшают итоговую сумму корзины, но цена отдельных товаров остаётся неизменной. Иногда требуется программно изменить стоимость конкретных товаров после применения определённого купона — например, для корректного отображения скидок или интеграции с внешними системами. Если вы сталкиваетесь с тем, что цена товара не меняется, хотя купон применён, значит нужно использовать правильные хуки и подходы.
Пошаговое решение: программное изменение цены товара после применения купона
1. Используем хук woocommerce_before_calculate_totals
Этот хук позволяет вмешаться в расчёт стоимости товаров в корзине и изменить цену до финального подсчёта.
add_action('woocommerce_before_calculate_totals', 'custom_change_product_price_after_coupon', 20, 1);function custom_change_product_price_after_coupon( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { return; } if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) { return; } // Проверяем, применён ли нужный купон $target_coupon_code = 'special10'; // замените на ваш код купона $applied_coupons = $cart->get_applied_coupons(); if ( ! in_array( $target_coupon_code, $applied_coupons ) ) { return; } // Перебираем все товары в корзине foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; // Например, меняем цену только для товара с ID 123 if ( $product->get_id() === 123 ) { $original_price = $product->get_regular_price(); $new_price = $original_price * 0.9; // скидка 10% $product->set_price( $new_price ); } }}2. Как применить код
Добавьте данный код в файл functions.php вашей дочерней темы или в плагин для кастомных функций. Не редактируйте файлы ядра WooCommerce.
3. Настройка под ваши условия
- Замените
special10на код купона, который вы используете. - Укажите ID товаров, для которых нужно менять цену, или расширьте логику условий по SKU, категории и т.д.
Проверка результата после внедрения
- Создайте купон с кодом, например,
special10в WooCommerce админке. - Добавьте товар с ID 123 в корзину.
- Примените купон на странице корзины.
- Обновите страницу и проверьте, изменилась ли цена товара на 10% ниже оригинала.
- Если цена изменилась — код работает корректно.
Частые ошибки и как их исправить
- Цена не меняется: убедитесь, что код купона правильно указан и купон действительно применён; проверьте, что ID товара совпадает.
- Цена меняется, но в корзине неверно отображается итоговая сумма: возможно конфликт с другими плагинами или кастомными функциями, отключите другие плагины и проверьте.
- Цена меняется несколько раз (зацикливание): используйте проверку
did_action('woocommerce_before_calculate_totals') >= 2для предотвращения повторного применения.
Практические советы по производительности и безопасности
- Не изменяйте цену товара глобально — меняйте цену только в объекте корзины, чтобы избежать проблем с ценами на сайте.
- Используйте кеширование и минимизируйте сложные вычисления внутри хука.
- Проверяйте совместимость с плагинами кэширования и оптимизации WooCommerce.
Сравнение способов изменения цены товара после применения купона
| Метод | Преимущества | Недостатки |
|---|---|---|
Использование woocommerce_before_calculate_totals | Гибко, работает на уровне корзины, прост в реализации | Не влияет на цену товара в каталоге, только в корзине |
Изменение цен через фильтр woocommerce_get_price | Изменяет цену везде (каталог, корзина) | Сложнее контролировать, может влиять на SEO и расчёты |
| Использование сторонних плагинов для скидок | Простая настройка без кода | Может быть дороже и менее гибко |
Дополнительные рекомендации
- Для сложных условий используйте дополнительные проверки: роли пользователя, время действия купона, категории товаров.
- Если нужно изменить цену для нескольких товаров — используйте массив с ID и циклы для применения скидок.
- Для интеграции с WPShop можно рассмотреть Clearfy Pro для оптимизации и очистки сайта после внедрения кастомного кода https://wpshop.ru/plugins/clearfy.