Диагностика проблемы с методами оплаты при отсутствии товара
В стандартной установке 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-сайте перед выкатыванием в продакшен.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Отключение всех методов оплаты (первый пример) | Простая реализация, надёжно предотвращает оплату | Может быть слишком жёстко, нет гибкости |
| Отключение конкретных методов (второй пример) | Гибко, можно оставить альтернативные способы | Сложнее поддерживать, может запутать клиентов |
| Использование плагинов-сток-менеджеров | Графический интерфейс, дополнительные функции | Может быть платным, нагрузка на сайт |