Диагностика проблемы: почему важно отключать оплату при отсутствии товаров
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары на складе заканчиваются, но покупатели всё равно могут оформить заказ и выбрать способ оплаты. Это приводит к отменам, недовольству клиентов и дополнительной нагрузке на службу поддержки.
Чтобы избежать этого, нужно автоматически отключать способы оплаты, если в корзине есть товары с нулевым запасом. Проверим, возникает ли такая ситуация на вашем сайте:
- Добавьте в корзину товар с количеством на складе 0;
- Перейдите к оформлению заказа;
- Проверьте, доступны ли способы оплаты.
Если способы оплаты доступны, несмотря на отсутствие товара на складе, значит, нужна доработка.
Как автоматически отключить способы оплаты при отсутствии товара на складе
Общая идея решения
С помощью фильтра woocommerce_available_payment_gateways мы можем программно отключить определённые методы оплаты, если в корзине есть товары с нулевым количеством на складе.
Пример рабочего кода
add_filter('woocommerce_available_payment_gateways', 'disable_payment_if_no_stock');
function disable_payment_if_no_stock($available_gateways) {
if (is_admin()) return $available_gateways; // Не применяем в админке
$cart = WC()->cart->get_cart();
foreach ($cart as $cart_item) {
$product = $cart_item['data'];
if (!$product->is_in_stock()) {
// Отключаем все способы оплаты
return array();
}
}
return $available_gateways;
}Этот код отключит все способы оплаты, если в корзине есть хотя бы один товар, которого нет на складе.
Отключение выборочных способов оплаты
Если нужно отключать не все способы, а только, например, cod (оплата при получении) и cheque, то код меняется так:
add_filter('woocommerce_available_payment_gateways', 'disable_specific_payments_if_no_stock');
function disable_specific_payments_if_no_stock($available_gateways) {
if (is_admin()) return $available_gateways;
$cart = WC()->cart->get_cart();
foreach ($cart as $cart_item) {
$product = $cart_item['data'];
if (!$product->is_in_stock()) {
unset($available_gateways['cod']);
unset($available_gateways['cheque']);
break;
}
}
return $available_gateways;
}Проверка результата после внедрения
- Добавьте в корзину товар с нулевым запасом.
- Перейдите на страницу оформления заказа.
- Убедитесь, что способы оплаты либо полностью отсутствуют, либо отсутствуют выбранные вами (например,
codиcheque). - Добавьте в корзину товар с положительным запасом, убедитесь, что способы оплаты доступны.
Частые ошибки и способы их исправления
- Код не работает в админке. Это нормально, фильтр применяется только на фронтенде. В админке оплату отключать не нужно.
- Способы оплаты не отключаются, хотя товара нет на складе. Проверьте, что у товаров действительно выставлен статус «нет в наличии» (is_in_stock() возвращает false). Иногда товар может иметь запас 0, но быть доступным для заказа (backorders). Нужно отключить backorders для корректной работы.
- После обновления WooCommerce код перестал работать. Проверьте актуальность хуков и методов, возможно, изменился API.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или в собственный плагин, чтобы при обновлении не потерять изменения.
- Используйте кэширование на уровне WooCommerce и сервера, чтобы не замедлять загрузку страницы оформления заказа.
- Тестируйте на различных конфигурациях товаров (вариации, групповые товары), чтобы убедиться в корректности работы.
- При большом каталоге товаров проверка запаса в корзине не будет заметной по производительности, так как вызывается один раз при загрузке страницы оформления заказа.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Отключение всех способов оплаты | Простая реализация, гарантирует отсутствие оплаты при отсутствии товаров | Пользователь не видит причины, может уйти с сайта | Магазин с ограниченными способами оплаты, нужно быстрое решение |
| Отключение отдельных способов оплаты | Гибкий контроль, сохраняет альтернативные способы | Требует настройки списка отключаемых методов | Нужно поддерживать разные способы оплаты для разных условий |
| Использование плагинов управления запасами | Расширенные функции, интеграция с другими системами | Дополнительные расходы, нагрузка на сайт | Большие магазины с комплексным управлением запасами |