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

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

WooCommerce по умолчанию не удаляет старые заказы, даже если они имеют статус «отменён» или «выполнен». Со временем база данных магазина растёт, что может замедлить работу сайта и усложнить администрирование. Автоматическое удаление заказов по статусу и дате помогает поддерживать чистоту базы и улучшать производительность.

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

Чтобы понять, что на вашем сайте накопилось слишком много заказов, зайдите в WooCommerce → Заказы и посмотрите общую статистику. При больших объёмах заказов (сотни тысяч) админка начинает работать медленно.

Для проверки можно использовать SQL-запрос к базе:

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

Если в статусах wc-completed, wc-cancelled и других много старых заказов, их имеет смысл массово удалить.

Пошаговое решение: автоматизация удаления заказов по статусу и дате

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

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

function wc_delete_old_orders_by_status_date() {
    if ( ! class_exists('WooCommerce') ) {
        return; // WooCommerce не активен
    }

    global $wpdb;
    $statuses = array('wc-cancelled', 'wc-failed', 'wc-refunded'); // Статусы для удаления
    $date_threshold = date('Y-m-d H:i:s', strtotime('-90 days')); // Удалять заказы старше 90 дней

    foreach ($statuses as $status) {
        // Получаем ID заказов
        $order_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            $status, $date_threshold
        ));
        if (!empty($order_ids)) {
            foreach ($order_ids as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление заказа
            }
        }
    }
}

2. Запускаем функцию автоматически по расписанию через WP-Cron

Добавьте следующий код для регистрации крон-задачи, которая будет запускать очистку раз в сутки:

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

add_action('wc_delete_old_orders_daily_event', 'wc_delete_old_orders_by_status_date');

3. По желанию: добавьте административное уведомление о выполнении задачи

Чтобы видеть отчёт о работе функции, можно добавить логирование в файл или выводить уведомления в админке. Например, логируем количество удалённых заказов в debug.log:

function wc_delete_old_orders_by_status_date() {
    if ( ! class_exists('WooCommerce') ) {
        return;
    }

    global $wpdb;
    $statuses = array('wc-cancelled', 'wc-failed', 'wc-refunded');
    $date_threshold = date('Y-m-d H:i:s', strtotime('-90 days'));
    $deleted_count = 0;

    foreach ($statuses as $status) {
        $order_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            $status, $date_threshold
        ));
        if (!empty($order_ids)) {
            foreach ($order_ids as $order_id) {
                if (wp_delete_post($order_id, true)) {
                    $deleted_count++;
                }
            }
        }
    }
    if (defined('WP_DEBUG') && WP_DEBUG) {
        error_log("WooCommerce: удалено заказов по статусу и дате - {$deleted_count}");
    }
}

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

  • Вручную запустите функцию из админки (через WP-CLI или временно вызовите напрямую) и проверьте в базе, что заказы старше 90 дней с указанными статусами удалились.
  • Проверьте логи debug.log на наличие строки с количеством удалённых заказов.
  • Убедитесь, что в разделе «Заказы» в админке количество заказов с выбранными статусами уменьшилось.
  • Через сутки проверьте, что WP-Cron сработал и удаление прошло автоматически.

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

  • Функция не запускается: Проверьте, что WooCommerce активен, и что хук WP-Cron зарегистрирован (wp_schedule_event). Можно использовать плагин WP Crontrol для диагностики.
  • Заказы не удаляются: Убедитесь, что статусы указаны правильно — в WooCommerce статусы заказов начинаются с wc-, например, wc-cancelled.
  • Удаляются не те заказы: Проверьте условие даты и статус. Можно временно вывести IDs заказов перед удалением для проверки.
  • Проблемы с производительностью при удалении большого количества заказов: Делайте удаление партиями, например, ограничьте количество заказов на итерацию, чтобы избежать тайм-аутов.

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

  • Добавьте nonce и проверку прав, если вызываете функцию через AJAX или вручную из админки.
  • Перед удалением сделайте резервную копию базы данных.
  • Ограничьте удаление заказов пакетами (например, по 50 заказов за раз), чтобы избежать перегрузки сервера:
function wc_delete_old_orders_by_status_date_batch() {
    global $wpdb;
    $statuses = array('wc-cancelled', 'wc-failed', 'wc-refunded');
    $date_threshold = date('Y-m-d H:i:s', strtotime('-90 days'));
    $batch_size = 50;

    foreach ($statuses as $status) {
        $order_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s LIMIT %d",
            $status, $date_threshold, $batch_size
        ));
        if (!empty($order_ids)) {
            foreach ($order_ids as $order_id) {
                wp_delete_post($order_id, true);
            }
        }
    }
}
  • Для контроля используйте плагин Clearfy Pro, который содержит инструменты для оптимизации базы данных WooCommerce.

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

МетодПлюсыМинусыПрименимость
Ручное удаление в админкеПросто, не требует кодаТрудоёмко при большом количестве заказовМалые объёмы
SQL-запросы напрямую в базеБыстро, массовоРиск повредить данные, нет учёта связейОпытным администраторам
Автоматизация через PHP и WP-Cron (код)Безопасно, гибко, автоматическое выполнениеТребует базовых навыков программированияСредние и большие магазины
Использование плагинов (например, Clearfy Pro)Удобно, дополнительные функции оптимизацииПлатные решения, нагрузка на сайтВсе уровни
WooCommerce: как отправлять подробные данные о заказе в Slack при оформлении
27.05.2026
WooCommerce: автоматическое удаление заказов по статусу и дате
24.04.2026
Как добавить настройку локализации в плагин WordPress
29.01.2026
Как добавить уведомление после обновления WordPress
26.03.2026
Как использовать метаданные для оптимизации WordPress
31.03.2026