WooCommerce: решение проблемы с неактивными заказами через Cron и PHP

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

Неактивные заказы в WooCommerce — это заказы, которые были созданы, но не завершены пользователем (например, не оплачены или отменены), и при этом остаются в базе данных. Они занимают место, замедляют работу магазина и могут влиять на точность отчетности и управление запасами.

Чтобы понять, есть ли проблема с такими заказами, выполните следующие действия:

  • Перейдите в WooCommerce > Заказы и фильтруйте заказы по статусу pending, failed или другим статусам, которые не меняются долгое время.
  • Проверьте количество таких заказов — если их сотни и они не двигаются по статусам, это признак накопления неактивных заказов.
  • В базе данных можно выполнить SQL-запрос для подсчёта таких заказов:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 7 DAY;

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

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

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

Добавьте следующий код в файл functions.php вашей активной темы или в специально созданный плагин:

function wpzen_delete_inactive_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            array(
                'column'    => 'post_date',
                'before'    => '7 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $orders = get_posts($args);

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

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

2. Настраиваем Cron-задачу для регулярного запуска

Добавим собственное событие в расписание WP Cron. Для этого:

// Регистрируем новое событие при инициализации
add_action('wpzen_daily_delete_inactive_orders', 'wpzen_delete_inactive_orders');

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

Этот код запускает удаление неактивных заказов ежедневно.

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

Чтобы не создавать мусор в расписании, добавьте очистку:

function wpzen_clear_cron_event() {
    $timestamp = wp_next_scheduled('wpzen_daily_delete_inactive_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpzen_daily_delete_inactive_orders');
    }
}
add_action('switch_theme', 'wpzen_clear_cron_event');

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

Чтобы убедиться, что удаление работает корректно:

  • Зайдите в админку WooCommerce > Заказы и проверьте количество заказов со статусом pending или failed.
  • Создайте тестовый заказ со статусом pending и датой более 7 дней назад (можно прямо в базе данных).
  • Выполните вручную функцию удаления через WP-CLI или временно вызовите wpzen_delete_inactive_orders() через functions.php.
  • Проверьте, что тестовый заказ удалился.
  • Для просмотра логов работы можно добавить логирование (например, в файл) внутри функции удаления.

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

  • Функция не запускается автоматически
    Проверьте, работает ли WP Cron на вашем сервере. По умолчанию WP Cron срабатывает при посещении сайта. Для надежности можно настроить системный Cron (crontab) для вызова wp-cron.php.
  • Удаляются не те заказы
    Проверьте корректность условий в get_posts: правильные статусы и дата. Не используйте post_status = 'pending', а именно wc-pending.
  • Ошибка при удалении заказов с зависимостями
    wp_delete_post с параметром true удаляет все данные. Если есть сторонние плагины, влияющие на заказы, убедитесь, что они корректно обрабатывают удаление.
  • Проблемы с производительностью при большом количестве заказов
    Для сотен и тысяч заказов стоит запускать удаление партиями. Можно разбить выборку по 50-100 заказов и удалять циклично.

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

  • Не удаляйте заказы с реальными транзакциями — используйте статус и дату как фильтр.
  • Для больших магазинов запускайте задачу в ночное время по системному Cron через WP-CLI:
    wp eval 'wpzen_delete_inactive_orders();'
  • Добавьте логирование в файл wp-content/wpshop_cron.log для мониторинга работы скрипта.
  • Не используйте частый запуск Cron (например, раз в час) без необходимости — достаточно одного раза в сутки.
  • Для надежности добавьте уведомление на email при выполнении задачи, если удалено более 100 заказов.

Сравнение вариантов удаления неактивных заказов

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаЗанимает время, не подходит для большого количества
WP Cron + PHP (своё решение)Автоматизация, гибкость, полный контрольНужны базовые навыки PHP, настройка Cron
Плагины для очистки WooCommerceУдобно, готовые решенияМожет конфликтовать с другими плагинами, зависит от поддержки
Как создать динамическую форму обратной связи на WordPress с AJAX
01.03.2026
Как ускорить загрузку изображений в WordPress с помощью lazy load и оптимизации
17.04.2026
WooCommerce: как использовать метод AJAX для обновления корзины без перезагрузки страницы
23.05.2026
WooCommerce: решение проблемы с необновляющимся статусом заказа через вебхуки
04.05.2026
Оптимизация загрузки шаблонов и стилей в WordPress: практические решения
17.02.2026