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

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

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

Как понять, что накопились неоплаченные заказы?

  • В админке WooCommerce в разделе «Заказы» видите множество заказов со статусом pending или failed.
  • Пользователи жалуются на невозможность оформить новый заказ или замедление работы сайта.
  • Проверка базы данных показывает большое количество записей типа shop_order, которые не переходят в статус processing или completed.

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

1. Создание функции для удаления старых неоплаченных заказов

Ниже пример функции, которая удаляет заказы со статусом pending и failed, созданные более 24 часов назад:

function wptask_delete_old_unpaid_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            array(
                'column'    => 'post_date',
                'before'    => '24 hours ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - удаление без возможности восстановления
    }
}

2. Регистрация WP-Cron задачи

Теперь добавим расписание и задание для периодического запуска функции:

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

add_action('wptask_delete_unpaid_orders_hook', 'wptask_delete_old_unpaid_orders');

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

Чтобы не оставлять мусор в WP-Cron, добавьте очистку расписания (например, в файле functions.php темы):

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

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

Для проверки, что удаление работает как нужно:

  • Создайте тестовый заказ с статусом pending и датой более 24 часов назад (можно вручную в базе или через админку с задержкой).
  • Запустите вручную функцию в админке через wp shell или добавьте временный вызов wptask_delete_old_unpaid_orders();.
  • Проверьте, что заказ удалён из wp_posts и связанных таблиц (wp_postmeta, wp_woocommerce_order_items и др.).
  • Убедитесь, что в разделе «Заказы» в админке WooCommerce больше нет старых неоплаченных заказов.

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

  • Заказы не удаляются: Проверьте, что статусы заказов правильно указаны с префиксом wc- (например, wc-pending, а не просто pending).
  • WP-Cron не срабатывает: Убедитесь, что на сайте есть посещения или настройте системный cron для запуска wp-cron.php (например, через wget -q -O - https://site.ru/wp-cron.php?doing_wp_cron раз в час).
  • Удаление вызывает ошибки: Проверьте логи сервера, возможно, функция вызывается с недостаточными правами. Выполняйте удаление с правами администратора.
  • Заказы удаляются слишком рано: Измените параметр 'before' => '24 hours ago' на более длительный период (например, 3 days ago), если хотите сохранять заказы дольше.

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

  • Всегда используйте wp_delete_post($order_id, true) для полного удаления, чтобы избежать накопления мусора в базе.
  • Для крупных магазинов с тысячами заказов используйте пагинацию при удалении (например, по 100 заказов за один запуск), чтобы избежать превышения лимита памяти и таймаутов.
  • Регулярно проверяйте, что WP-Cron работает корректно, особенно если на сайте мало трафика.
  • Резервное копирование базы данных перед внедрением автоматического удаления — обязательное требование.
  • Если нужна более гибкая очистка, рассмотрите интеграцию с WP-CLI для запуска команд вручную или из системных cron.

Сравнение способов удаления неоплаченных заказов

МетодПлюсыМинусы
WP-Cron + пользовательская функцияПолный контроль, бесплатно, гибкоЗависит от посещаемости сайта, возможны таймауты
Плагины очистки WooCommerce (например, "WooCommerce Order Cleaner")Простая настройка, интерфейсДополнительная нагрузка, возможны конфликты
Системный cron + WP-CLI скриптыНадёжность, стабильность, не зависит от трафикаТребует доступа к серверу и настройки
Автоматическое закрытие открытых тикетов поддержки в WordPress
22.02.2026
Как создать автоматические резервные копии WordPress: плагины и код
21.11.2025
Как использовать хуки в WordPress для автоматизации задач
07.12.2025
WooCommerce: как настроить автоматическое удаление неоплаченных заказов
23.05.2026
Правильное использование REST API в WordPress для автоматизации задач
25.02.2026