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

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

В WooCommerce стандартно статус заказа меняется автоматически после успешной оплаты. Однако неоплаченные заказы часто остаются со статусом pending или on-hold, что захламляет базу данных и усложняет управление заказами. Если в вашем магазине много таких заказов, необходимо автоматизировать их обработку — например, переводить в статус cancelled через определённое время после создания.

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

  • Большое количество заказов со статусом pending, которые не были оплачены в течение суток;
  • Ручное удаление или изменение статусов занимает много времени;
  • Пользователи жалуются на запутанность статусов в личном кабинете.

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

Реализуем cron-задачу, которая будет регулярно проверять неоплаченные заказы и менять их статус на cancelled спустя заданный промежуток времени (например, 24 часа).

1. Добавление пользовательского cron-ивента

add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['every_five_minutes'])) {
        $schedules['every_five_minutes'] = [
            'interval' => 300, // 5 минут в секундах
            'display'  => __('Каждые 5 минут')
        ];
    }
    return $schedules;
});

if (!wp_next_scheduled('wpd_auto_cancel_unpaid_orders')) {
    wp_schedule_event(time(), 'every_five_minutes', 'wpd_auto_cancel_unpaid_orders');
}

2. Реализация функции смены статуса

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

    $orders = wc_get_orders($args);
    foreach ($orders as $order) {
        $order->update_status('cancelled', 'Автоматическое отменение заказа из-за отсутствия оплаты');
    }
});

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

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

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

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

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

  • Cron не запускается автоматически: убедитесь, что на сайте не отключён WP-Cron (проверьте DISABLE_WP_CRON в wp-config.php) или настройте системный cron на вызов wp-cron.php.
  • Функция wc_get_orders не находит заказы: проверьте корректность параметров фильтрации, особенно дату и статус.
  • Статусы не меняются: убедитесь, что у пользователя, под которым запускается скрипт, есть права на изменение заказов, и что нет конфликтов с другими плагинами.
  • Проблемы с производительностью при большом количестве заказов: добавьте лимит в выборке и запускайте обработку пакетами.

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

  • Используйте wc_get_orders с параметром limit, чтобы обрабатывать заказы партиями (например, по 50 штук), чтобы избежать перегрузки памяти.
  • Добавьте проверку nonce и прав доступа, если функция запускается через пользовательский интерфейс.
  • Отключите автоматическое выполнение WP-Cron и настроите системный cron на вызов wp-cron.php раз в 5 минут для стабильности и снижения нагрузки.
  • Логируйте действия изменения статуса в отдельный файл для отладки и аудита.

Сравнение способов автоматического изменения статуса заказа

СпособПлюсыМинусыРекомендации
Код с WP-Cron (как в статье)Полный контроль, без сторонних плагинов, гибкостьНужна базовая настройка cron, возможны проблемы при большом количестве заказовПодходит для опытных разработчиков, оптимизировать под нагрузку
Плагин автоматизации заказовПростота настройки, готовые функции, поддержкаДополнительная нагрузка, зависимость от стороннего ПО, возможные конфликтыЕсли нужна быстрая настройка без кода
Ручное удаление заказовПростотаТрудозатратно, риск ошибок, не масштабируемоПодходит только для малых магазинов
Как создать мультиязычный сайт на WordPress без плагинов
14.12.2025
WooCommerce: автоматическое удаление отменённых заказов по расписанию с примером кода
15.06.2026
WooCommerce: автоматическое удаление отменённых заказов по расписанию
27.05.2026
Как правильно использовать wp_enqueue_script для удалённой загрузки JS в WooCommerce
22.04.2026
WooCommerce: автоматическое изменение статуса заказа при неудачной оплате
12.06.2026