WooCommerce: как правильно настроить отложенный платёж с автоматическим отключением способов оплаты

Проблема: отложенный платёж и неправильное отображение способов оплаты в WooCommerce

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

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

Проверьте, как WooCommerce обрабатывает статусы заказов и способы оплаты:

  • В настройках «Способы оплаты» посмотрите, какие из них активны для конкретных статусов заказов.
  • Убедитесь, что в процессе оформления заказа статусы меняются корректно (например, pending — ожидает оплаты, processing — оплачено).
  • Проверьте, не конфликтуют ли плагины, которые могут вмешиваться в логику оплаты (кэш, кастомные обработчики статусов).

Для диагностики можно включить логирование WooCommerce через WooCommerce → Статус → Логи и отследить, как меняются статусы и вызываются ли функции отключения способов оплаты.

Пошаговое решение: правильная настройка отложенного платежа

1. Проверка и настройка статусов заказов

По умолчанию WooCommerce использует следующие статусы:

  • pending — заказ создан, оплата не начата;
  • on-hold — оплата ожидается (например, при банковском переводе);
  • processing — оплата принята, заказ в обработке;
  • completed — заказ выполнен.

Для отложенного платежа чаще используют статус on-hold или создают кастомный статус, чтобы чётко разделять неоплаченные заказы.

2. Отключение способов оплаты после оформления заказа

Чтобы способы оплаты автоматически отключались для оплаченных или в процессе оплаты заказов, нужно использовать хук woocommerce_available_payment_gateways. Ниже пример, который отключает все способы оплаты, если заказ уже оформлен и не имеет статус pending или on-hold:

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

    // Получаем текущий заказ через сессию или параметр
    $order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
    if (!$order_id) return $available_gateways;

    $order = wc_get_order($order_id);
    if (!$order) return $available_gateways;

    $status = $order->get_status();

    // Оставляем способы оплаты только для неоплаченных заказов
    if (!in_array($status, array('pending', 'on-hold'))) {
        return array(); // Отключаем все способы оплаты
    }

    return $available_gateways;
}

3. Автоматическое отключение определённых способов оплаты по статусу

Если нужно отключать не все, а определённые способы оплаты (например, отключить "Оплата при доставке" для неоплаченных заказов), можно использовать следующий код:

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

    $order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;
    if (!$order_id) return $available_gateways;

    $order = wc_get_order($order_id);
    if (!$order) return $available_gateways;

    $status = $order->get_status();

    if (!in_array($status, array('pending', 'on-hold'))) {
        // Отключаем оплату при доставке
        unset($available_gateways['cod']);
    }

    return $available_gateways;
}

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

  • Оформите заказ с выбранным способом оплаты.
  • После оформления попытайтесь перейти на страницу оплаты того же заказа с параметром ?order_id=ID_заказа.
  • Убедитесь, что способы оплаты отключены или ограничены согласно логике.
  • Проверьте смену статусов в админке WooCommerce и соответствие поведения сайта.

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

  • Неверное получение ID заказа: Очень часто разработчики пытаются получить заказ из сессии или cookie без проверки. В приведённом коде используется GET-параметр order_id. Если он отсутствует — способы оплаты не меняются.
  • Отключение способов оплаты в админке: Не исключайте проверку is_admin(), иначе администратор не сможет создавать заказы.
  • Конфликты с кешированием: Если вы используете плагины кеширования, убедитесь, что страницы оформления заказа и оплаты не кешируются.
  • Неучёт кастомных статусов: Если на сайте добавлены кастомные статусы заказов, необходимо расширить массив статусов в проверках.

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

  • Используйте проверку nonce и права доступа при получении параметров order_id, если внедряете код в публичные формы.
  • Минимизируйте логику в хуках, избегайте лишних запросов к базе внутри фильтров.
  • Периодически очищайте старые неоплаченные заказы или архивируйте их, чтобы не создавать нагрузку на базу данных.
  • Рассмотрите использование плагина Clearfy Pro для оптимизации WooCommerce и автоматического удаления мусора в базе — https://wpshop.ru/plugins/clearfy?utm_source=wpeducation.ru&utm_medium=article&utm_campaign=woocommerce-pravilnaya-nastrojka-otlozhennogo-platega

Сравнение вариантов реализации отключения способов оплаты

МетодПлюсыМинусыПрименение
Через хук woocommerce_available_payment_gateways Гибко, позволяет настроить логику для любых статусов и способов оплаты Требует программирования, можно ошибиться с логикой Для кастомных решений и точного контроля
Плагины для отложенного платежа (например, WooCommerce Deposits) Готовое решение с UI, поддержка платежей частями Может быть избыточным, влияет на производительность Для магазинов с большой клиентской базой и частичной оплатой
Кастомные статусы и правила в админке Удобно для администраторов, простота использования Ограниченная автоматизация, требует ручного контроля Для небольших магазинов с ручным управлением заказами
WooCommerce: как ограничить доступ к товарам по авторизации пользователя
07.06.2026
Как создать многоуровневую навигацию в WordPress
04.12.2025
Как автоматизировать управление пользовательскими ролями в WordPress: практические решения и примеры кода
03.03.2026
Как создать меню с иконками в WordPress без плагинов
27.02.2026
WooCommerce: автоматическое отключение платежных систем при неоплате заказа
27.05.2026