Как использовать WP-Cron для автоматического удаления старых заказов WooCommerce

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

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

Однако стандартного функционала для автоматической очистки заказов WooCommerce нет, поэтому приходится реализовывать это вручную через WP-Cron или сторонние плагины.

Как настроить WP-Cron для удаления заказов WooCommerce старше N дней

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

Для начала напишем функцию, которая будет удалять заказы старше заданного количества дней. В WooCommerce заказы — это кастомный тип записи shop_order с метаполем _completed_date или post_date.

function wp3_delete_old_woocommerce_orders() {
    $days = 30; // количество дней, старше которых заказы будут удаляться
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-completed', 'wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'column'   => 'post_date',
                'before'   => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление без перемещения в корзину
        }
    }
}

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

Добавим событие, которое будет запускать функцию ежедневно. Для этого создадим крон-хук и зарегистрируем событие при активации темы или плагина.

add_action('wp3_daily_order_cleanup_event', 'wp3_delete_old_woocommerce_orders');

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

3. Удаление задачи при деактивации

Чтобы не оставлять лишние задачи, удалим крон-событие при деактивации темы или плагина.

function wp3_clear_daily_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wp3_daily_order_cleanup_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wp3_daily_order_cleanup_event');
    }
}

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

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

  • Временно изменить интервал удаления на меньшее количество дней (например, 1 день) и создать старые заказы вручную через тестовый импорт или изменение даты в базе;
  • Выполнить функцию вручную через вызов wp3_delete_old_woocommerce_orders() в консоли WP-CLI или через временный вызов в functions.php;
  • Проверить наличие заказов старше заданного срока в базе данных до и после выполнения задачи (через phpMyAdmin или WP-CLI команду).

Также можно добавить логирование в функцию для вывода количества удалённых заказов:

function wp3_delete_old_woocommerce_orders() {
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-completed', 'wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'column'   => 'post_date',
                'before'   => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true);
        }
        error_log('WP3: Удалено заказов WooCommerce старше ' . $days . ' дней: ' . count($old_orders));
    } else {
        error_log('WP3: Нет заказов для удаления старше ' . $days . ' дней');
    }
}

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает на сервере. Для этого можно использовать плагин WP Crontrol или вызвать задачу вручную.
  • Удаляются не те заказы: Возможно, неверно указан статус заказа в аргументах запроса. Убедитесь, что вы выбираете статусы, которые хотите удалять (например, wc-completed или wc-cancelled).
  • Крон запускается слишком часто или редко: Проверьте расписание с помощью WP Crontrol и при необходимости настройте интервал или принудительный запуск.
  • Производительность падает: Если заказов очень много, удаление всех за один проход может быть ресурсоёмким. Разбейте удаление на порции (например, по 50 заказов за раз) и используйте повторные вызовы.

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

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

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

МетодПлюсыМинусыКогда использовать
WP-Cron с кастомным кодом Полный контроль, бесплатно, гибко Зависит от посещаемости сайта, требует навыков программирования Малые и средние магазины, когда нужен точный кастомный функционал
Плагины для очистки базы (например, WP Sweep) Просто установить, графический интерфейс Могут не поддерживать WooCommerce или удалять с ограничениями Для быстрой очистки с минимальными настройками
Серверный cron с WP-CLI Быстро и надежно, не зависит от трафика Требует доступа к серверу и базовых знаний Linux Большие магазины с большим объемом данных
Как использовать хук 'comment_post' для управления комментариями в WordPress
15.12.2025
Как автоматизировать удаление старых чрезвычайных постов в WordPress
06.04.2026
Как изменить автозаголовок постов в WordPress
27.01.2026
Как автоматизировать удаление спама в комментариях WordPress
08.02.2026
Как правильно использовать AJAX в WordPress для объявлений и форм
07.03.2026