WooCommerce: как исключить товары со скидкой из способов оплаты

Диагностика задачи: зачем исключать товары со скидкой из способов оплаты

В интернет-магазинах на 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Быстро, без сторонних плагинов, гибкоТребует навыков программирования, возможны ошибки
Плагины ограничения оплатыУпрощают настройку, готовый интерфейсДополнительная нагрузка, платные версии, ограниченная кастомизация
Комбинация кода и плагиновМаксимальная гибкость и контрольСложнее в поддержке
Как отладить проблемы с кэшированием в WordPress
01.12.2025
Автоматизированный импорт продуктов в WordPress: практическое руководство с WPBono
16.03.2026
WooCommerce: как избежать конфликтов между платежными шлюзами
30.05.2026
Как использовать хук pre_get_posts для гибкой фильтрации запросов в WordPress
13.12.2025
Использование хука wpbono_pre_update_post для кастомизации обновления записей в WordPress
15.01.2026