Диагностика задачи: зачем исключать товары со скидкой из способов оплаты
В интернет-магазинах на WooCommerce часто возникает необходимость ограничить способы оплаты для товаров, участвующих в акции или распродаже. Например, исключить оплату при получении (наложенный платеж) для товаров со скидкой, чтобы избежать рисков возврата или мошенничества. Это не стандартный функционал WooCommerce, и решить задачу можно только с помощью кастомной логики.
Как определить товары со скидкой в корзине
Товары считаются со скидкой, если у них установлена sale price или активна акция. В WooCommerce это можно проверить так:
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
if ( $product->is_on_sale() ) {
// Товар со скидкой
}
}Функция is_on_sale() возвращает true, если у товара есть скидка.
Пошаговое решение: исключение способов оплаты при наличии товара со скидкой
Чтобы запретить определённые способы оплаты, если в корзине есть хотя бы один товар со скидкой, нужно использовать фильтр woocommerce_available_payment_gateways. Ниже рабочий пример:
add_filter('woocommerce_available_payment_gateways', 'exclude_payment_for_sale_products');
function exclude_payment_for_sale_products( $available_gateways ) {
if ( ! is_admin() && is_checkout() ) {
$has_sale_product = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
if ( $product->is_on_sale() ) {
$has_sale_product = true;
break;
}
}
if ( $has_sale_product ) {
// Перечислите ID способов оплаты для исключения
$excluded_gateways = array('cod', 'cheque');
foreach ( $excluded_gateways as $gateway_id ) {
if ( isset( $available_gateways[ $gateway_id ] ) ) {
unset( $available_gateways[ $gateway_id ] );
}
}
}
}
return $available_gateways;
}В примере исключаются способы оплаты cod (наложенный платеж) и cheque (оплата чеком), если в корзине есть товар со скидкой.
Проверка результата
- Добавьте в корзину товар с активной скидкой и перейдите на страницу оформления заказа.
- Убедитесь, что указанные способы оплаты отсутствуют в списке.
- Добавьте товар без скидки и проверьте, что способы оплаты отображаются.
- Очистите корзину и повторите тесты для разных сценариев.
Частые ошибки и как их исправить
- Способы оплаты не скрываются: проверьте правильность ID платежных шлюзов. Их можно узнать в настройках WooCommerce, а также вывести
print_r(array_keys($available_gateways));для отладки. - Функция срабатывает в админке: добавьте проверку
! is_admin()иis_checkout(), чтобы исключить нежелательное поведение. - Кэширование страниц: если используете кэш, очистите его после внесения изменений или отключите кэш для страницы оформления заказа.
- Проблемы с плагинами оплаты: некоторые плагины могут создавать дополнительные методы оплаты с нестандартными ID — проверьте эти ID для корректного исключения.
Практические советы по производительности и безопасности
- Минимизируйте логику в хук, чтобы не замедлять загрузку страницы оформления заказа.
- Проверяйте только корзину, не делайте запросы к базе данных вне необходимости.
- Используйте дочернюю тему или плагин для добавления кода, чтобы не потерять изменения при обновлениях.
Сравнение вариантов решения
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php | Быстро, без сторонних плагинов, гибко | Требует навыков программирования, возможны ошибки |
| Плагины ограничения оплаты | Упрощают настройку, готовый интерфейс | Дополнительная нагрузка, платные версии, ограниченная кастомизация |
| Комбинация кода и плагинов | Максимальная гибкость и контроль | Сложнее в поддержке |