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

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

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

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

Для оценки накопления старых заказов воспользуйтесь SQL-запросом для подсчёта заказов по статусам и дате:

SELECT post_status, COUNT(*) AS count_orders FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Если количество заказов с статусами wc-cancelled, wc-failed или wc-refunded превышает несколько тысяч, а последние обновления были несколько месяцев назад, это сигнал к очистке.

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

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

Функция принимает параметры — массив статусов и дату, по которым удалит заказы:

function wp1_delete_old_orders_by_status_and_date($statuses = ['wc-cancelled', 'wc-failed'], $older_than_days = 30) {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$older_than_days} days"));

    // Получаем ID заказов для удаления
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('" . implode("','", $statuses) . "') AND post_date < %s",
        $date_threshold
    ));

    if (empty($order_ids)) {
        return 0; // Нет заказов для удаления
    }

    require_once ABSPATH . 'wp-admin/includes/post.php';
    $deleted_count = 0;
    foreach ($order_ids as $order_id) {
        // Удаляем заказ без возможности восстановления
        if (wp_delete_post($order_id, true)) {
            $deleted_count++;
        }
    }
    return $deleted_count;
}

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

add_action('wp1_daily_delete_old_orders', function() {
    $deleted = wp1_delete_old_orders_by_status_and_date(['wc-cancelled', 'wc-failed', 'wc-refunded'], 60);
    if ($deleted) {
        error_log("[WP1] Deleted {$deleted} old WooCommerce orders.");
    }
});

// Добавляем расписание при активации темы или плагина
function wp1_schedule_delete_orders_cron() {
    if (!wp_next_scheduled('wp1_daily_delete_old_orders')) {
        wp_schedule_event(time(), 'daily', 'wp1_daily_delete_old_orders');
    }
}
add_action('wp', 'wp1_schedule_delete_orders_cron');

3. Как отключить задачу

function wp1_unschedule_delete_orders_cron() {
    $timestamp = wp_next_scheduled('wp1_daily_delete_old_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp1_daily_delete_old_orders');
    }
}

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

  • Выполните вручную функцию wp1_delete_old_orders_by_status_and_date(['wc-cancelled'], 1) через WP-CLI или временный вызов, чтобы сразу увидеть результат удаления.
  • Проверьте лог ошибок сервера или файл debug.log (если включён WP_DEBUG_LOG) на наличие записей с удалёнными заказами.
  • В админке WooCommerce зайдите в раздел Заказы и отфильтруйте по статусам, чтобы убедиться, что старые заказы отсутствуют.

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

Ошибка 1: заказы не удаляются, хотя функция возвращает положительный результат

Причина: кэш объектов или плагин кеширования задерживает обновления. Решение: очистите кеш WordPress и кеш браузера, проверьте отключение кеширующих плагинов.

Ошибка 2: функция wp_delete_post возвращает false

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

Ошибка 3: задача WP-Cron не запускается

Причина: на сайте отключён WP-Cron или мало посетителей. Решение: настройте системный cron на вызов wp-cron.php или запускайте задачи вручную через WP-CLI.

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

  • Удаляйте старые заказы только с правильными статусами: отменённые, проваленные или возвращённые — не трогайте оплаченные и обрабатываемые.
  • Перед удалением делайте резервные копии базы данных.
  • Для больших магазинов удаляйте заказы партиями, чтобы избежать тайм-аутов PHP (можно реализовать пагинацию в SQL-запросе).
  • Отключите удаление заказов в периоды пиковых нагрузок.
  • Используйте WP-CLI для запуска очистки на больших магазинах — это более надёжно, чем WP-Cron.

Сравнение вариантов реализации автоматического удаления заказов WooCommerce

МетодПреимуществаНедостаткиКогда использовать
WP-Cron с кастомным кодомГибко, без сторонних плагинов, легко адаптироватьЗависит от посещаемости сайта, возможны тайм-аутыСредние магазины с регулярным трафиком
WP-CLI скрипт для удаленияБыстро, не зависит от трафика, управляемо из терминалаТребует доступа к серверу и навыков CLIКрупные магазины с большим объёмом заказов
Плагины очистки базы данныхПростота установки, интерфейс для настройкиМогут удалять лишнее, меньше контроляНачинающие пользователи, небольшие сайты
Автоматическое удаление старых записей WordPress по дате публикации
08.04.2026
Удаление заказов WooCommerce по дате и статусу
01.05.2026
Как автоматически очистить библиотеку медиа в WordPress от неиспользуемых файлов
28.03.2026
Как автоматически отключать плагины в WordPress при возникновении ошибок
08.03.2026
Автоматическое сброс изображений в WordPress для оптимизации медиа-библиотеки
11.03.2026