Диагностика проблемы: почему выставляются счета при отключенных платежах
В WooCommerce иногда возникает ситуация, когда клиентам продолжают автоматически выставляться счета, несмотря на то, что все платежные методы отключены. Это приводит к путанице и ошибкам при оформлении заказов, а также лишней нагрузке на поддержку.
Основные признаки проблемы:
- В настройках WooCommerce все платежные шлюзы отключены;
- Заказы переходят в статус «Ожидает оплаты» и генерируются счета;
- Клиенты получают уведомления о необходимости оплаты, хотя оплатить нельзя;
Почему так происходит?
По умолчанию WooCommerce не блокирует создание заказов с выставлением счетов, если выбран способ оплаты «Оплата при получении» или если в коде темы/плагина есть кастомные обработчики статусов. Также часть сторонних плагинов может автоматически создавать счета или выставлять заказы в нужный статус вне зависимости от активных платежей.
Пошаговое решение: запрет выставления счетов при отключенных платежах
Ниже приведён метод на PHP для functions.php вашей темы или в виде отдельного мини-плагина, который блокирует оформление заказа, если неактивен ни один из платежных методов:
add_filter('woocommerce_checkout_process', 'block_checkout_if_no_payment_methods');
function block_checkout_if_no_payment_methods() {
$available_gateways = WC()->payment_gateways()->get_available_payment_gateways();
if (empty($available_gateways)) {
wc_add_notice(__('Оплата временно недоступна. Пожалуйста, попробуйте позже.'), 'error');
}
}Этот фильтр запускается при попытке оформить заказ. Если массив доступных платежей пуст, пользователь увидит ошибку, и заказ не создастся.
Дополнительно: убрать автоматическое выставление счетов для офлайн-методов
Если вы используете офлайн-платежи (например, «Оплата при получении»), можно дополнительно запретить автоматическую смену статуса заказа на «Ожидает оплаты» с выставлением счета. Для этого добавьте:
add_action('woocommerce_checkout_order_processed', 'disable_invoice_creation_for_offline', 10, 3);
function disable_invoice_creation_for_offline($order_id, $posted_data, $order) {
$payment_method = $order->get_payment_method();
$offline_methods = array('cod', 'cheque', 'bacs'); // список офлайн-методов
if (in_array($payment_method, $offline_methods)) {
$order->update_status('pending'); // заказ остаётся в ожидании, без счета
}
}Проверка результата после внедрения
Для тестирования:
- Отключите все платежные методы в WooCommerce;
- Попробуйте оформить заказ на сайте;
- Убедитесь, что при попытке оформления появляется ошибка «Оплата временно недоступна» и заказ не создаётся;
- Если офлайн-методы активированы, проверьте, что статус заказа не меняется автоматически без вашей команды.
Частые ошибки и их исправление
- Ошибка: После внедрения кода заказ всё равно создаётся и выставляется счёт.
Причина: Кэширование сайта или сторонние плагины перезаписывают логику.
Решение: Очистите кэш, временно отключите плагины, связанные с оплатой, и повторите тест. - Ошибка: Клиенты не видят сообщение об ошибке.
Причина: Некорректное подключение фильтра или конфликт с темой.
Решение: Проверьте, что код добавлен в functions.php активной темы или в плагин, и что нет синтаксических ошибок. - Ошибка: Офлайн-методы всё равно генерируют счета.
Причина: Названия методов в коде не совпадают с идентификаторами платежей.
Решение: Проверьте идентификаторы в WooCommerce > Настройки > Платежи и обновите массив$offline_methods.
Практические советы по безопасности и производительности
- Добавляйте кастомный код через дочернюю тему или отдельный плагин, чтобы не потерять при обновлениях.
- Тестируйте изменения на staging-среде, особенно если на сайте активно много плагинов платежей.
- Используйте Clearfy Pro для оптимизации WooCommerce — этот плагин помогает отключать ненужные стили и скрипты, что улучшит производительность сайта.
- Отключение выставления счетов при отсутствии платежей снижает вероятность мошенничества и ошибок при оплате, повышая безопасность процесса оформления заказа.
Сравнение способов решения проблемы
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Отключение платежей в админке | Простое отключение всех платежей | Быстро и без кода | Заказы могут создаваться с ошибками |
| Код на PHP с проверкой доступных платежей | Блокирует оформление без активных платежей | Гибко, можно кастомизировать | Требуется навыки PHP |
| Использование сторонних плагинов | Плагины для контроля оформления и счетов | Дополнитель функционал | Может замедлять сайт, платные |