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

В чём заключается задача: отключить оплату для заказов с конкретным статусом

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

Диагностика проблемы: почему заказ может быть оплачен повторно

Если в вашем магазине WooCommerce клиенты могут повторно оплатить уже отменённые или ожидающие статуса заказы, это происходит из-за того, что метод оплаты не проверяет статус заказа перед включением кнопки оплаты. В стандартном WooCommerce кнопка «Оплатить» доступна для заказов со статусом pending или failed. Если вы используете сторонние статусы или кастомные сценарии, они могут не учитываться.

Проверить текущие статусы заказа можно в админке WooCommerce в разделе Заказы. Обратите внимание, какие статусы появляются и допускают повторную оплату.

Пошаговое решение: как отключить оплату для заказов с выбранным статусом

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

Пример кода, который отключает оплату для заказов со статусом cancelled и refunded:

add_filter('woocommerce_valid_order_statuses_for_payment', 'disable_payment_for_specific_statuses', 10, 2);
function disable_payment_for_specific_statuses($statuses, $order) {
    $blocked_statuses = array('cancelled', 'refunded');
    if (in_array($order->get_status(), $blocked_statuses)) {
        return array(); // Отключаем все статусы для оплаты
    }
    return $statuses;
}

Этот код нужно добавить в файл functions.php вашей дочерней темы или в кастомный плагин.

Что делает код

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

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

  1. Создайте заказ с одним из заблокированных статусов, например, cancelled.
  2. Перейдите на страницу оплаты данного заказа (обычно URL вида /checkout/order-pay/<order_id>/).
  3. Убедитесь, что кнопка оплаты отсутствует или недоступна.
  4. Создайте заказ с разрешённым статусом (например, pending) и проверьте, что кнопка оплаты отображается.

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

  • Кнопка оплаты всё равно отображается для заблокированного статуса
    Проверьте, действительно ли статус заказа совпадает с тем, что указан в массиве $blocked_statuses. Используйте error_log($order->get_status()); для отладки.
  • Код не работает на странице оплаты
    Убедитесь, что код добавлен в правильное место и активирован. Проверьте логи ошибок PHP.
  • Конфликт с плагинами оплаты
    Некоторые плагины могут игнорировать этот фильтр. В таком случае нужно смотреть документацию плагина и искать их хуки для контроля отображения кнопки.

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

  • Не отключайте оплату для статусов, которые могут использоваться клиентом для повторной попытки оплаты — это может сбить покупателя.
  • Используйте конкретные статусы, а не общие, чтобы не блокировать оплату случайно.
  • Добавьте логирование для отладки, чтобы отслеживать, когда и какие заказы блокируются.
  • Не забывайте тестировать на тестовом сайте перед внесением изменений в рабочий магазин.

Сравнение вариантов решения

МетодОписаниеПлюсыМинусы
Фильтр woocommerce_valid_order_statuses_for_paymentОтключение оплаты через фильтрацию статусов заказаЛёгкий в реализации, не требует сторонних плагиновНе всегда учитывается плагинами оплаты
JS-скрипт на фронтендеСкрыть кнопку оплаты через JavaScriptБыстро и простоНенадёжно, пользователь может обойти
Плагин для управления статусамиИспользование готовых решений с настройкамиУдобство, поддержкаМогут влиять на производительность, платные
Как добавить собственные настройки в админ-панель WordPress
01.12.2025
Как сделать автоматический импорт из CSV в WordPress без плагинов
19.03.2026
Как удалить кеш в WordPress: практические способы и примеры кода
28.12.2025
WooCommerce: как автоматически удалять товары после отмены заказа
05.06.2026
Как использовать REST API в WordPress для создания пользовательских настроек
14.11.2025