Автоматическое отменение неоплаченных заказов в WooCommerce

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

В WooCommerce по умолчанию неоплаченные заказы остаются в статусе «Ожидает оплаты» или «В обработке» до тех пор, пока пользователь не завершит оплату или администратор не вмешается вручную. Это приводит к накоплению большого количества «висящих» заказов, что усложняет управление магазином и портит статистику.

Автоматическое отменение заказов, которые не были оплачены в течение заданного времени, позволяет оптимизировать работу магазина, освободить ресурсы и улучшить качество отчетности.

Как определить, что заказ нужно отменять

Чаще всего отменяют заказы, которые остаются неоплаченными более 1-2 часов. Для этого нужно проверить статус заказа и дату создания. WooCommerce использует статусы заказов:

  • pending — ожидает оплаты;
  • failed — неудачная оплата;
  • on-hold — заказ поставлен на удержание;
  • cancelled — отменён.

Наша логика будет: если заказ в статусе pending и создан более 2 часов назад — отменить.

Пошаговое решение: автоматическая отмена заказов через крон

1. Настройка задачи 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 = [
        'status' => 'pending',
        'date_created' => '<' . (new WC_DateTime('-2 hours'))->format('Y-m-d H:i:s'),
        'limit' => -1,
    ];
    $orders = wc_get_orders($args);
    foreach ($orders as $order) {
        $order->update_status('cancelled', 'Заказ автоматически отменен из-за отсутствия оплаты в течение 2 часов.');
    }
});

3. Отключение задачи при деактивации плагина или темы

register_deactivation_hook(__FILE__, function() {
    $timestamp = wp_next_scheduled('auto_cancel_unpaid_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'auto_cancel_unpaid_orders');
    }
});

Как проверить, что автоматическая отмена работает

  1. Создайте новый заказ в статусе pending (можно через фронтэнд или вручную в админке).
  2. Измените дату создания заказа на более чем 2 часа назад в базе данных или с помощью плагина для редактирования заказов.
  3. Запустите cron-задачу вручную, если используете плагин WP Crontrol, или подождите час.
  4. Проверьте, что заказ изменил статус на cancelled и в истории заказа появился комментарий об автоматической отмене.

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

  • Заказы не отменяются: проверьте, запланирована ли cron-задача через wp_next_scheduled. Иногда на локальных серверах cron не срабатывает — используйте системный cron для запуска wp-cron.php.
  • Неправильный статус заказа: убедитесь, что фильтр 'status' => 'pending' корректно применяется, и заказы действительно в этом статусе.
  • Дата создания заказа не учитывается: важно использовать формат даты Y-m-d H:i:s и объект WC_DateTime для правильного сравнения.

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

  • При большом количестве заказов ограничьте количество обрабатываемых заказов за один запуск (например, 'limit' => 50), чтобы избежать превышения времени выполнения скрипта.
  • Добавьте логирование отмен для последующего аудита, используя встроенный логгер WooCommerce или отдельный файл.
  • Для повышения надежности используйте системный cron вместо стандартного wp-cron, особенно на крупных магазинах.
  • Проверяйте влияние на интеграции с платежными шлюзами — некоторые из них сами могут отменять неоплаченные заказы.

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

МетодПлюсыМинусыПодходит для
Код в functions.php или плагине (cron) Полный контроль, бесплатно, гибко Требует навыков разработки, возможны ошибки Разработчики и опытные администраторы
Плагины (например, "WooCommerce Order Status Manager" с автоотменой) Простота настройки, интерфейс Может быть платным, ограниченная кастомизация Новички, магазины без разработчиков
Внешние сервисы автоматизации Автоматизация без нагрузки на сайт Сложнее интегрировать, дополнительные расходы Крупные проекты с бюджетом
Как удалить и заблокировать IP-адреса в WordPress
11.02.2026
Как использовать AJAX для отзывов в WordPress без перезагрузки страницы
21.01.2026
Как создать автоматический импорт данных из JSON в WordPress с примерами кода
07.02.2026
Как создать собственный тип поста с уникальными полями в WordPress
11.01.2026
Как добавить собственную таблицу в базу данных WordPress с примером кода
01.12.2025