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

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

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

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

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

1. Определяем критерии отключения оплаты

Для автоматизации выберем следующие условия:

  • Статус заказа — pending (ожидание оплаты).
  • Время с момента создания заказа превышает порог (например, 24 часа).

2. Создаём WP-Cron задачу для регулярной проверки

Добавим в functions.php или в плагин код для планирования задачи, которая раз в час будет проверять неподтверждённые заказы и обновлять их статус и доступность оплаты.

if (!wp_next_scheduled('disable_payment_for_pending_orders')) {
    wp_schedule_event(time(), 'hourly', 'disable_payment_for_pending_orders');
}

add_action('disable_payment_for_pending_orders', 'disable_pending_orders_payment');

function disable_pending_orders_payment() {
    $args = [
        'status' => 'pending',
        'date_created' => '<' . (new WC_DateTime())->modify('-24 hours')->format('Y-m-d H:i:s'),
        'limit' => -1
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        // Меняем статус заказа на "отменён" или кастомный
        $order->update_status('cancelled', 'Оплата не подтверждена в течение 24 часов.');
        $order->save();
    }
}

3. Блокируем возможность оплаты для отменённых заказов

Чтобы полностью заблокировать оплату для таких заказов, можно убрать кнопку оплаты на странице заказа:

add_filter('woocommerce_get_checkout_payment_url', function($url, $order) {
    if ($order && $order->has_status('cancelled')) {
        return '';
    }
    return $url;
}, 10, 2);

4. Альтернативный вариант — добавление пользовательского статуса

Если не устраивает смена статуса на "cancelled", можно создать кастомный статус expired и для него отключить оплату. Это более гибкий вариант, но требует регистрации статуса и дополнительной обработки.

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

  • Создайте тестовый заказ с оплатой "pending" и выставьте дату создания старше 24 часов (можно вручную в БД).
  • Запустите вручную событие cron (через WP-CLI или плагин WP Crontrol) или дождитесь автоматического запуска.
  • Проверьте, что статус заказа изменился на cancelled (или кастомный).
  • Попробуйте перейти по ссылке оплаты — кнопка должна отсутствовать.

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

  • WP-Cron не запускается автоматически: хук не срабатывает, потому что на сайте нет посетителей. Решение — настроить системный cron или запускать вручную через WP-CLI.
  • Заявленные заказы не меняют статус: проверьте правильность даты создания заказа и фильтра в wc_get_orders. Формат даты должен быть точным.
  • Оплата всё ещё доступна для отменённых заказов: проверьте фильтр woocommerce_get_checkout_payment_url и очистите кэш сайта.
  • Конфликты с другими плагинами: если есть плагины управления заказами, они могут переопределять статусы — протестируйте на чистом сайте.

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

  • При частой обработке большого количества заказов ограничьте выборку порциями (limit) и используйте пагинацию, чтобы избежать превышения памяти.
  • Регулярно очищайте отменённые заказы, чтобы база не раздувалась.
  • Используйте WP-Cron правильно: для большого трафика лучше настроить системный cron, чтобы избежать двойных запусков.
  • Для повышения безопасности проверяйте права пользователя при запуске функций, если делаете интерфейс для админов.

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

МетодПлюсыМинусыПример использования
Изменение статуса заказа (cancelled)Простота, совместимость с WooCommerceЗаказ теряет статус "ожидания", не всегда подходит для кастомных процессовКод в WP-Cron выше
Создание кастомного статуса (expired)Гибкость, можно отдельно обрабатывать такие заказыНужно регистрировать статус и дополнительно блокировать оплатуРегистрация через register_post_status и фильтры оплаты
Отключение оплаты через фильтры без смены статусаСохраняется статус, быстро и простоЗаказы "pending" остаются в системе без измененийФильтр woocommerce_get_checkout_payment_url
Как создать автоматическое резервное копирование в WordPress
15.11.2025
Как автоматизировать создание задач из форм в WordPress
12.03.2026
Автоматическое создание и управление задачами в WordPress с помощью WPTasks
06.03.2026
Как автоматизировать управление ролями в WordPress
02.12.2025
Автоматическое отправление отчёта о задачах WordPress по email
21.02.2026