Диагностика проблемы: почему стандартного функционала WooCommerce недостаточно
По умолчанию WooCommerce позволяет изменять стоимость товаров через купоны и скидки, но иногда требуется более гибкое решение. Например, изменить цену не только при применении купона, но и учитывать дополнительные условия — статус заказа, выбранный метод оплаты или наличие других товаров в корзине. Стандартные купоны не поддерживают такие сценарии, а плагины с подобной логикой часто избыточны и снижают производительность.
Задача: реализовать автоматическое изменение стоимости товаров при оплате с поддержкой купонов, учитывая комплексные условия, используя кастомный PHP-код.
Как проверить текущую проблему
- Создайте купон с фиксированной скидкой или процентом в WooCommerce.
- Примените купон в корзине и оформите заказ с разными способами оплаты.
- Проверьте, что скидка применяется одинаково и без условий, которые вы хотите учесть.
Если вы хотите изменить цену только при определённом методе оплаты или при наличии купонов, стандартный функционал не позволит это сделать.
Пошаговое решение: изменение цены с учётом купонов и оплаты
1. Отслеживаем применение купона и метод оплаты
Используем хук woocommerce_cart_calculate_fees для добавления корректировки цены. В этом хуке можно проверить применённые купоны и выбранный способ оплаты (если он уже выбран).
2. Добавляем корректировку цены через сборы корзины
add_action('woocommerce_cart_calculate_fees', 'custom_discount_with_coupon_and_payment', 20, 1);
function custom_discount_with_coupon_and_payment($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
// Проверяем, применён ли нужный купон
$target_coupon = 'specialdiscount'; // замените на ваш купон
$applied_coupons = $cart->get_applied_coupons();
if (!in_array($target_coupon, $applied_coupons)) return;
// Получаем выбранный метод оплаты из сессии
$chosen_payment_method = WC()->session->get('chosen_payment_method');
if ($chosen_payment_method !== 'cod') { // например, только для оплаты при получении
return;
}
// Рассчитываем скидку - например, 10% от суммы товаров
$discount = $cart->subtotal * 0.10;
// Добавляем отрицательный сбор, чтобы снизить итог
$cart->add_fee(__('Дополнительная скидка', 'woocommerce'), -$discount);
}3. Обновление цены при смене способа оплаты на странице оформления заказа
Чтобы скидка обновлялась динамически при смене способа оплаты, добавим скрипт, который будет триггерить обновление корзины:
add_action('wp_footer', 'custom_payment_method_change_script');
function custom_payment_method_change_script() {
if (!is_checkout()) return;
?>
<script type="text/javascript">
jQuery(function($){
$('form.checkout').on('change', 'input[name="payment_method"]', function(){
$('body').trigger('update_checkout');
});
});
</script>
<?php
}Проверка результата после внедрения
- Создайте купон с кодом
specialdiscount. - Добавьте товары в корзину и примените купон.
- Перейдите к оформлению заказа, выберите способ оплаты
Оплата при получении(код методаcod). - Убедитесь, что дополнительная скидка 10% от суммы товаров появляется в итогах заказа.
- Попробуйте сменить способ оплаты на другой — скидка должна исчезнуть.
Частые ошибки и как их исправить
- Скидка не появляется при применении купона
— Проверьте совпадение кода купона в коде и в админке WooCommerce.
— Убедитесь, что хукwoocommerce_cart_calculate_feesдобавлен правильно и не конфликтует с другими плагинами. - Скидка не обновляется при смене метода оплаты
— Проверьте подключение JavaScript, который обновляет корзину при смене оплаты.
— Убедитесь, что на странице оформления используется стандартный checkout WooCommerce без кастомных шаблонов, нарушающих события. - Сумма скидки рассчитана неверно
— Проверьте логику расчёта скидки и используемые свойства объекта корзины ($cart->subtotal,$cart->total).
Практические советы по безопасности и производительности
- Всегда проверяйте, что код не выполняется в административной части сайта, чтобы избежать лишней нагрузки (
is_admin()иDOING_AJAX). - Используйте точечные условия для применения скидок, чтобы избежать конфликтов и ошибок.
- Не храните критичные данные в сессии без проверки — используйте безопасные методы доступа к данным WooCommerce.
- Минимизируйте количество JavaScript-обработчиков на странице оформления заказа для улучшения скорости.
Сравнение подходов изменения цены с учётом купонов и оплаты
| Метод | Преимущества | Недостатки | Пример использования |
|---|---|---|---|
| Стандартные купоны WooCommerce | Простота, встроенная поддержка | Ограниченные условия, нельзя учитывать метод оплаты | Скидка 10% на все товары |
| Плагины скидок с условиями | Гибкая логика, интерфейс для условий | Дополнительная нагрузка, возможные конфликты | Скидка при оплате конкретным методом |
| Кастомный код через хуки | Максимальный контроль, минимальная нагрузка | Требует навыков разработки, сложно поддерживать | Автоматическое изменение цены с учётом купона и оплаты |