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

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

В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или failed, которые никогда не переходят в оплату. Это создает лишнюю нагрузку на базу данных, замедляет работу панели администратора и усложняет аналитику. Автоматическое удаление таких заказов по дате поможет поддерживать базу чистой и ускорить работу сайта.

Диагностика: как определить, что заказы можно удалить

Для начала нужно понять, какие заказы считаются «неактивными» и подходят под удаление. Обычно это заказы со статусом pending или failed, созданные более 30 дней назад. Чтобы проверить, сколько таких записей у вас на сайте, выполните следующий SQL-запрос в phpMyAdmin или через WP CLI:

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 30 DAY;

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

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

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

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

function wpcore_delete_old_inactive_orders() {
    global $wpdb;
    $statuses = ['wc-pending', 'wc-failed'];
    $date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));

    $placeholders = implode(',', array_fill(0, count($statuses), '%s'));

    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($placeholders) AND post_date < %s",
        ...$statuses, $date_limit
    );

    $order_ids = $wpdb->get_col($query);
    if(empty($order_ids)) {
        return 0;
    }

    require_once ABSPATH . 'wp-admin/includes/post.php';

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // true - принудительное удаление без корзины
    }

    return count($order_ids);
}

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

Чтобы функция запускалась автоматически, добавим событие в WP Cron. Поместите код ниже также в functions.php или плагин:

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

add_action('wpcore_cleanup_old_orders_hook', function() {
    $deleted = wpcore_delete_old_inactive_orders();
    if ($deleted) {
        error_log("[WPcore] Deleted $deleted old inactive WooCommerce orders.");
    }
});

3. Ручной запуск через WP CLI

Для тестирования и разового запуска удобно использовать WP CLI. Создайте кастомную команду в плагине или используйте этот код для запуска из консоли:

wp eval 'echo "Deleted: " . wpcore_delete_old_inactive_orders() . " orders\n";'

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

  • Запустите WP CLI-команду и убедитесь, что выводит количество удалённых заказов.
  • Через phpMyAdmin проверьте, что заказы со статусами wc-pending и wc-failed старше 30 дней отсутствуют.
  • В панели WooCommerce убедитесь, что старые неактивные заказы исчезли.
  • Проверьте журнал ошибок (error_log), чтобы увидеть записи о выполнении задачи.

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

  • Заказы не удаляются: возможно, Cron-задача не активирована. Проверьте в админке или используйте плагин WP Crontrol для проверки и запуска задач.
  • Ошибка доступа к базе данных: проверьте значения глобальной переменной $wpdb и правильность SQL-запроса.
  • Удалились нужные заказы: убедитесь, что в фильтре статусов и дат нет ошибок, например, неверно указана дата или статус.
  • Не удаляются связанные метаданные или записи: используйте wp_delete_post с параметром true, чтобы удалить пост полностью с метаданными.

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

  • Используйте параметр true в wp_delete_post для полного удаления без перемещения в корзину, чтобы не увеличивать нагрузку.
  • Ограничьте выборку заказов по дате, чтобы не перегружать сервер большим числом запросов за один запуск.
  • Для сайтов с огромным количеством заказов разбивайте удаление на партии по 100-200 записей, чтобы избежать таймаутов.
  • Логируйте результаты работы Cron-задачи в отдельный файл или системный лог для мониторинга.
  • Проверьте, что ваша тема или плагины не создают свои кастомные статусы заказов, которые тоже нужно учитывать.

Таблица сравнения способов удаления старых заказов

МетодОписаниеПлюсыМинусы
WP Cron + PHP (описанный метод) Автоматическое удаление заказов по расписанию через wp_schedule_event Автоматизация, контроль, не требует внешних инструментов Зависит от посещаемости сайта, может сработать с задержкой
WP CLI скрипт Ручной запуск удаления из консоли Моментальный запуск, подходит для больших сайтов Требуется доступ к серверу и знание командной строки
Плагины очистки заказов Готовые решения с интерфейсом и настройками Удобство, дополнительные функции Нагрузка, возможные конфликты, платные дополнения
Как добавить автоматическое удаление спам-комментариев в WordPress
09.04.2026
Как добавить многоуровневое меню в WordPress с помощью кода
13.03.2026
Как автоматически отключать неиспользуемые плагины в WordPress
14.01.2026
Как установить ограничение на размер загружаемых файлов в WordPress
12.02.2026
WooCommerce: как автоматически удалять неактивные заказы по дате
29.04.2026