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

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

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

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

Для начала нужно понять, сколько неоплаченных заказов скопилось и как долго они не оплачиваются. В админке WooCommerce перейдите в Заказы и отфильтруйте по статусу pending или failed. Если таких заказов много и они создавались несколько дней или недель назад, пора автоматизировать их удаление.

Также проверьте таблицу wp_posts с типом shop_order и мета-данные заказа в wp_postmeta для оценки объема.

Решение: автоматическое удаление заказов по таймауту

Реализуем автоматическую очистку неоплаченных заказов через CRON-задачу и PHP-функцию, которая будет запускаться ежедневно и удалять заказы со статусом pending старше определенного количества часов.

1. Добавление PHP-функции удаления заказов

function wpkey_delete_expired_pending_orders() {
    $hours = 24; // Таймаут в часах
    $time_limit = strtotime('-' . $hours . ' hours');

    $args = array(
        'status' => 'pending',
        'limit' => -1,
        'date_created' => '<' . date('Y-m-d H:i:s', $time_limit),
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Полное удаление заказа
    }
}

В этом коде мы получаем все заказы со статусом pending, созданные более 24 часов назад, и удаляем их полностью из базы.

2. Регистрация ежедневного CRON-задачи

Чтобы функция запускалась автоматически, добавим событие в WordPress Cron:

function wpkey_schedule_daily_order_cleanup() {
    if (!wp_next_scheduled('wpkey_daily_order_cleanup_event')) {
        wp_schedule_event(time(), 'daily', 'wpkey_daily_order_cleanup_event');
    }
}
add_action('wp', 'wpkey_schedule_daily_order_cleanup');

add_action('wpkey_daily_order_cleanup_event', 'wpkey_delete_expired_pending_orders');

Этот код регистрирует ежедневное событие, которое запускает функцию удаления.

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

  • В админке WooCommerce проверьте статус заказов: pending старше 24 часов должны исчезать ежедневно.
  • Можно вручную запустить функцию для теста, вызвав wpkey_delete_expired_pending_orders() в консоли WP-CLI или через временный хук.
  • Проверьте логи сервера на ошибки выполнения CRON.

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

  • CRON не срабатывает: Убедитесь, что на сайте есть трафик, иначе WordPress Cron не запускается автоматически. Для надежности можно настроить системный CRON на сервере, вызывающий wp-cron.php.
  • Заказы не удаляются: Проверьте, что функция wp_delete_post вызывается с параметром true для полного удаления, а не только перемещения в корзину.
  • Удаление затрагивает другие статусы: Проверьте правильность фильтра в wc_get_orders, чтобы выбрать только pending.

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

  • Перед удалением заказов создайте резервную копию базы данных.
  • Для крупных магазинов с тысячами заказов ограничьте количество удаляемых заказов за один крон-запуск, например, 'limit' => 100, чтобы избежать таймаутов.
  • Логируйте удаляемые ID заказов в отдельный файл для аудита.

Альтернативные варианты реализации

МетодПлюсыМинусы
Использование PHP и WP-Cron (как в статье)Полный контроль, бесплатное решениеЗависит от трафика сайта, возможны таймауты
Плагины очистки заказов (например, "WooCommerce Cancel Abandoned Order")Простая настройка, готовый функционалМожет влиять на производительность, зависит от обновлений плагина
Внешние скрипты CRON с WP-CLIНезависимость от WP-Cron, надежностьТребует доступа к серверу и навыков CLI
Как выполнить проверку безопасности WordPress с помощью PHP и AJAX
19.02.2026
WooCommerce: автоматическое изменение статуса заказа при отсутствии оплаты
16.05.2026
Как создать собственный виджет в WordPress с поддержкой AJAX
10.12.2025
Как использовать хуки WordPress для расширения функционала сайта
22.12.2025
WooCommerce: установка и настройка подтверждения заказа с помощью Webhook
27.04.2026

Ресурс в разработке, скоро здесь будет сайт по вордпресс