WooCommerce: автоматическое удаление заказов по сроку с помощью WP-Cron

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

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

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

  • В панели WordPress админка заказов грузится медленно или подвисает.
  • Увеличенный размер таблиц wp_posts и wp_postmeta из-за большого количества записей типа shop_order.
  • Высокая нагрузка на базу данных при запросах к заказам.
  • Замедленная генерация отчетов и статистики.

Для проверки количества заказов в базе можно выполнить SQL-запрос через phpMyAdmin или плагин Query Monitor:

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

Если количество отменённых и завершённых заказов насчитывает десятки тысяч, стоит задуматься об их очистке.

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

1. Создаём WP-Cron задачу

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

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

2. Функция удаления заказов

Добавим обработчик события, который будет удалять заказы старше 30 дней со статусом cancelled или failed:

add_action( 'wpgen_delete_old_woocommerce_orders_hook', 'wpgen_delete_old_orders' );

function wpgen_delete_old_orders() {
    $days_to_keep = 30; // количество дней хранения заказов
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_to_keep} days" ) );

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

    $old_orders = get_posts( $args );

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

    foreach ( $old_orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true — удаление без корзины
    }
}

3. Очистка и тестирование

Для запуска задачи вручную можно использовать плагин WP Crontrol или выполнить напрямую:

do_action( 'wpgen_delete_old_woocommerce_orders_hook' );

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

Проверка результата

  • Через админ-панель WooCommerce обновите список заказов и убедитесь, что отменённые и неактивные заказы старше 30 дней отсутствуют.
  • Повторите SQL-запрос, чтобы увидеть уменьшение количества заказов со статусами wc-cancelled и wc-failed.
  • Проверьте логи сервера на отсутствие ошибок удаления.

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

  • Задача WP-Cron не запускается — проверьте, что на сайте есть реальный трафик или настройте системный cron на сервере для запуска wp-cron.php. Без этого задачи не будут выполняться вовремя.
  • Заказы не удаляются, хотя условие подходит — убедитесь, что статусы заказов указаны правильно (например, wc-cancelled вместо просто cancelled).
  • Удаление приводит к ошибкам или зависаниям — попробуйте разбить удаление на порции, например, 50 заказов за раз, чтобы снизить нагрузку.

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

  • Удаляйте заказы только с нужными статусами, чтобы не потерять важные данные.
  • Резервируйте базу данных перед внедрением автоматического удаления.
  • Для больших магазинов используйте WP-CLI скрипты для очистки, чтобы избежать таймаутов HTTP.
  • Ограничьте количество удаляемых заказов за раз, чтобы не перегружать сервер.
  • Используйте плагин Clearfy Pro для оптимизации базы и удаления мусорных данных без потери важных записей: https://wpshop.ru/plugins/clearfy

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

МетодПлюсыМинусы
WP-Cron с кастомным кодомГибкость, не требует плагинов, можно настроить логикуЗависимость от трафика, возможны таймауты при большом объёме
Плагины очистки заказовПростота установки, интерфейс, часто есть расписаниеМогут быть тяжелыми, не всегда гибкие
WP-CLI скриптыОчень быстрые, можно запускать вручную или по cronТребуют доступа к серверу, навыков работы с консолью
Оптимизация загрузки изображений в WordPress для ускорения сайта
17.12.2025
Как создать функцию автоматического удаления старых записей через WP-Cron в WordPress
07.01.2026
WooCommerce: автоматическое удаление просроченных заказов с помощью WP-Cron
17.07.2026
WooCommerce: как избежать проблем с ответственным сохранением данных в корзине
27.05.2026
Как добавить автоматическое сохранение данных в формах WordPress
27.02.2026