WooCommerce: автоматическое отключение способа оплаты при отсутствии товара на складе

Диагностика проблемы с методами оплаты при отсутствии товара

В стандартной установке WooCommerce методы оплаты доступны вне зависимости от наличия товаров в корзине. Это приводит к ситуации, когда покупатель может выбрать оплату, хотя один или несколько товаров отсутствуют на складе, что вызовет ошибки при оформлении заказа или недовольство клиентов.

Для начала проверьте, действительно ли товары с отсутствующим запасом попадают в корзину и позволяют выбрать все методы оплаты. Перейдите в WooCommerce → Настройки → Оплата и убедитесь, что все способы оплаты активны.

Добавьте любой товар с нулевым запасом в корзину и перейдите к оформлению заказа. Если способы оплаты не отключаются, значит требуется кастомизация.

Как автоматически отключить способы оплаты при отсутствии товаров на складе

Общая идея решения

Мы используем хук woocommerce_available_payment_gateways, который фильтрует доступные методы оплаты на странице оформления заказа. Внутри функции проверяем запас всех товаров в корзине. Если хотя бы один товар отсутствует на складе (запас ≤ 0), отключаем все методы оплаты, либо определённые.

Пример кода для functions.php или кастомного плагина

add_filter('woocommerce_available_payment_gateways', 'disable_payment_if_out_of_stock');
function disable_payment_if_out_of_stock($available_gateways) {
    if (is_admin()) return $available_gateways; // не трогаем админку

    $cart = WC()->cart;
    if (!$cart) return $available_gateways;

    foreach ($cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        if (!$product->is_in_stock()) {
            // отключаем все методы оплаты
            return array();
        }
    }

    return $available_gateways;
}

Этот код проверяет каждый товар в корзине на наличие на складе. Если есть хотя бы один отсутствующий товар, возвращает пустой массив, что отключает все способы оплаты.

Отключение только конкретных способов оплаты

Если нужно отключить не все, а только некоторые методы оплаты (например, только "Оплата картой"), можно модифицировать функцию так:

add_filter('woocommerce_available_payment_gateways', 'disable_card_payment_if_out_of_stock');
function disable_card_payment_if_out_of_stock($available_gateways) {
    if (is_admin()) return $available_gateways;

    $cart = WC()->cart;
    if (!$cart) return $available_gateways;

    foreach ($cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        if (!$product->is_in_stock()) {
            if (isset($available_gateways['stripe'])) { // пример: отключаем Stripe
                unset($available_gateways['stripe']);
            }
        }
    }

    return $available_gateways;
}

Проверка результата после внедрения

  • Добавьте товар с нулевым запасом в корзину.
  • Перейдите на страницу оформления заказа.
  • Подтвердите, что все (или определённые) методы оплаты не отображаются.
  • Добавьте товар с достаточным запасом и повторите проверку — методы оплаты должны быть доступны.

Также можно временно добавить error_log('Out of stock payment disabled'); в функцию для отладки.

Частые ошибки и как их исправить

  • Проблема: Методы оплаты не отключаются.
    Причина: Кэширование платежных шлюзов или страницы оформления заказа.
    Решение: Очистите кэш, отключите кеширующие плагины на время теста.
  • Проблема: Функция не срабатывает в админке.
    Причина: Это сделано специально, чтобы не влиять на админ-панель.
    Решение: Проверьте, что вы тестируете на фронтенде.
  • Проблема: В корзине отображается товар без запаса, но методы оплаты доступны.
    Причина: Использование плагинов, изменяющих логику запасов.
    Решение: Проверьте совместимость и при необходимости доработайте функцию с учётом плагинов.

Практические советы по безопасности и производительности

  • Отказывайтесь от отключения методов оплаты на основе пользовательского ввода без проверки наличия товара сервером.
  • Не используйте тяжелые запросы в функции фильтра, так как она вызывается при каждом рендере страницы оформления заказа.
  • Если у вас много товаров и настроены сложные запасы, кэшируйте результат проверки в сессии пользователя.
  • Обязательно тестируйте на staging-сайте перед выкатыванием в продакшен.

Сравнение вариантов реализации

МетодПлюсыМинусы
Отключение всех методов оплаты
(первый пример)
Простая реализация,
надёжно предотвращает оплату
Может быть слишком жёстко,
нет гибкости
Отключение конкретных методов
(второй пример)
Гибко,
можно оставить альтернативные способы
Сложнее поддерживать,
может запутать клиентов
Использование плагинов-сток-менеджеровГрафический интерфейс,
дополнительные функции
Может быть платным,
нагрузка на сайт
Как удалить неиспользуемые поля в базе данных WordPress для оптимизации
18.02.2026
Как автоматически отключить XML-RPC в WordPress для повышения безопасности
06.04.2026
Как отключить и удалить pings (pingbacks и trackbacks) в WordPress для защиты от спама
06.03.2026
Автоматическое удаление неиспользуемых плагинов WordPress
23.03.2026
Как создать автоматический импорт контента в WordPress с помощью REST API
12.02.2026