WooCommerce: автоматическая отмена незавершённых платежей

Почему важно автоматически отменять незавершённые платежи в WooCommerce

Незавершённые платежи (отложенные или зависшие заказы) создают нагрузку на базу данных, мешают анализу доходов и могут запутать покупателей. Автоматическая отмена таких заказов помогает поддерживать чистоту магазина и улучшает пользовательский опыт.

Диагностика проблемы с незавершёнными платежами

Для начала нужно понять, какие заказы считаются незавершёнными. В WooCommerce статусы заказов:

  • pending — заказ создан, но оплата не начата;
  • on-hold — ожидает оплаты или проверки;
  • failed — оплата не прошла;
  • processing и completed — успешные оплаты.

Чаще всего проблема возникает с заказами в статусе pending или on-hold, которые остаются в базе длительное время.

Для диагностики выполните SQL-запрос в phpMyAdmin или через WP-CLI, чтобы узнать количество таких заказов старше 24 часов:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') AND post_date < NOW() - INTERVAL 1 DAY;

Если число большое, пора автоматизировать очистку.

Пошаговое решение: скрипт для автоматической отмены незавершённых заказов

Для реализации используем WP-Cron и встроенные функции WooCommerce.

1. Добавляем новую задачу в WP-Cron

add_action('wp', function() {
    if (!wp_next_scheduled('auto_cancel_unpaid_orders')) {
        wp_schedule_event(time(), 'hourly', 'auto_cancel_unpaid_orders');
    }
});

2. Создаем функцию отмены заказов

add_action('auto_cancel_unpaid_orders', function() {
    $args = [
        'limit' => -1,
        'status' => ['pending', 'on-hold'],
        'date_created' => '<' . (new WC_DateTime('-24 hours'))->getTimestamp(),
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $order->update_status('cancelled', 'Автоматическая отмена: платеж не завершён в течение 24 часов.');
    }
});

Обратите внимание, что:

  • Мы отменяем заказы, созданные более 24 часов назад.
  • Статус меняется на cancelled, чтобы сохранить историю.

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

1. Убедитесь, что WP-Cron работает: создайте тестовый заказ в статусе pending и измените дату создания на 25 часов назад (через базу).

2. Запустите WP-Cron вручную через плагин WP Crontrol или через WP-CLI:

wp cron event run auto_cancel_unpaid_orders

3. Проверьте, что статус заказа изменился на cancelled.

4. Регулярно мониторьте базу данных, чтобы убедиться, что новые старые заказы обрабатываются.

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

  • Задача WP-Cron не запускается: Убедитесь, что на сайте есть трафик (WP-Cron по умолчанию срабатывает при посещении). Для сайтов с низким трафиком настройте системный CRON и wp-cron.php.
  • Заказы не попадают под фильтр времени: Проверьте правильность временной зоны WordPress и используйте классы WC_DateTime для работы с датами.
  • Отмена заказа не обновляет статус корректно: Проверьте, что нет конфликтующих плагинов, изменяющих статусы заказов.

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

  • Для крупных магазинов с тысячами заказов используйте пагинацию в запросах (limit и paged) чтобы не перегружать сервер.
  • Добавьте логирование отменённых заказов, чтобы отслеживать действия и быстро реагировать на возможные проблемы.
  • Если используете сторонние платежные шлюзы, убедитесь, что отмена заказа корректно синхронизируется с их API, чтобы избежать конфликтов.
  • Для ускорения работы можно кэшировать результаты запросов и периодически очищать кэш.

Сравнение вариантов реализации

МетодПлюсыМинусы
WP-Cron с PHP-кодом (как выше)Полный контроль, не требует дополнительных плагиновЗависит от трафика, может не сработать на слабонагруженных сайтах
Плагин автоматизации (например, WP Crontrol + кастомные хуки)Удобство управления задачами через админкуДополнительная нагрузка, зависит от качества плагина
Системный CRON + WP CLIНадёжность и точность срабатывания, не зависит от трафикаТребует доступа к серверу и базовых знаний Linux
Как создать автоматический отчёт по платежам в WordPress с помощью вебхуков
09.02.2026
Как настроить безопасные платежные формы в WordPress
21.12.2025
Как автоматизировать управление возвратами в WordPress
22.02.2026
WooCommerce: как установить платежные лимиты по пользователям
12.06.2026
Как добавить поддержку криптовалют в платежные системы WordPress
05.02.2026