Диагностика проблемы: зачем менять цену товара при использовании купона
Во многих интернет-магазинах на WooCommerce возникает задача не просто снизить итоговую сумму заказа с помощью купона, а изменить цену конкретного товара, когда покупатель применяет определённый купон. Например, при активации купона цена на товар должна стать фиксированной или измениться по определённой формуле. Стандартные возможности WooCommerce позволяют применять скидку к корзине, но нет встроенного механизма динамического изменения цены товара в зависимости от купона.
Если вы столкнулись с тем, что при применении купона цена на отдельный товар не меняется, а нужно именно такое поведение, значит, требуется кастомизация через хуки WooCommerce.
Как работает изменение цены товара в WooCommerce через хуки
Цены товаров в WooCommerce можно изменять динамически с помощью фильтра woocommerce_get_price или woocommerce_product_get_price (для последних версий WooCommerce). Для изменения цены именно при применении купона нужно отследить активный купон и в зависимости от его кода возвращать новую цену товара.
Пошаговое решение
- Определить код купона, при котором меняется цена.
- Добавить фильтр для изменения цены товара при расчёте.
- Проверить, что купон применён.
- Изменить цену для нужного товара.
Пример кода для 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) | Быстро, много функций, поддержка | Платный, может нагрузить сайт, часто избыточный функционал | Если нужно много правил и удобный интерфейс |
| Кастомный код (фильтр цены + проверка купона) | Точно под задачу, легковесно, бесплатно | Требует навыков разработки, ограниченный функционал | Для простой логики изменения цены при конкретных купонах |