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

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

Магазины на WooCommerce с большим трафиком и объемом заказов часто сталкиваются с замедлением работы сайта из-за большого количества старых заказов в базе данных. Закрытые и неактивные заказы — это заказы, которые уже не нужны для текущих процессов, но остаются в базе, вызывая рост размера таблиц и замедление запросов.

Чтобы убедиться, что именно эти заказы влияют на производительность, проверьте таблицу wp_posts с типом shop_order и статусами заказов. Особенно это актуально для статусов cancelled, failed, refunded и completed с датой старше нескольких месяцев.

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

Что считать неактивным заказом

Под неактивными понимаются заказы, которые имеют статус cancelled, failed или refunded и были созданы более 30 дней назад. Также можно добавить completed заказы старше 1 года, если для бизнеса не требуется хранить историю.

Пошаговое решение через добавление кода в functions.php или в кастомный плагин

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

function wc_delete_old_inactive_orders() {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return;
    }
    $statuses_to_delete = array( 'cancelled', 'failed', 'refunded' );
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d', strtotime('-30 days')),
    );
    $orders = wc_get_orders( array(
        'status' => $statuses_to_delete,
        'date_created' => $date_query,
        'limit' => -1,
        'return' => 'ids',
    ) );
    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

// Регистрируем ежедневное событие, если еще не зарегистрировано
if ( ! wp_next_scheduled( 'wc_daily_delete_old_orders' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_daily_delete_old_orders' );
}

// Привязываем функцию к событию
add_action( 'wc_daily_delete_old_orders', 'wc_delete_old_inactive_orders' );

Этот код удалит навсегда (второй параметр true в wp_delete_post) заказы со статусами cancelled, failed и refunded старше 30 дней.

Удаление старых заказов со статусом completed

Если нужно удалить completed заказы старше 1 года, добавьте дополнительный вызов:

function wc_delete_old_completed_orders() {
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d', strtotime('-1 year')),
    );
    $orders = wc_get_orders( array(
        'status' => 'completed',
        'date_created' => $date_query,
        'limit' => -1,
        'return' => 'ids',
    ) );
    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}
add_action( 'wc_daily_delete_old_orders', 'wc_delete_old_completed_orders' );

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

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

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

Число заказов должно уменьшиться после запуска крона. Также можно увидеть логи работы крона через плагин WP Crontrol или отладить вызов функции вручную.

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

  • Функция не вызывается: Проверьте, что событие wp_cron действительно запускается (например, активируйте плагин WP Crontrol и убедитесь, что задача запланирована).
  • Статусы заказов указаны без префикса wc-: В WooCommerce статусы хранятся с префиксом, например wc-cancelled. При использовании wc_get_orders достаточно указывать без wc-, но для SQL-запросов обязательно с префиксом.
  • Удаление не происходит из-за прав: Код должен выполняться с правами администратора, убедитесь, что нет ограничений по ролям.
  • Удаление приводит к ошибкам: Не используйте массовое удаление при большом количестве заказов без ограничения по партиям, иначе может быть превышен лимит памяти или время выполнения.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Если заказов много, разбивайте удаление на партии по 100-200 заказов за раз, чтобы избежать таймаутов. Например, добавьте параметр 'limit' => 100 и используйте пагинацию.
  • Отключите удаление заказов, если в магазине идет акция или период отчетности.
  • Логируйте удаленные заказы в отдельный файл или таблицу, чтобы можно было восстановить данные при необходимости.
  • Для оптимизации работы используйте плагин Clearfy Pro от WPShop (https://wpshop.ru/plugins/clearfy?utm_source=wp-ai.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-zakrytyh-i-neaktivnyh-zakazov-cherez-kod), который имеет встроенные инструменты очистки и оптимизации WooCommerce.

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

МетодПлюсыМинусыПример использования
Ручное удаление через админкуПростота, нет кодаТрудозатратно, не подходит для больших объемовWooCommerce - Заказы - выбор и удаление
Плагин очистки WooCommerceАвтоматизация, удобствоМожет быть платным, лишние функцииClearfy Pro, WP-Optimize
Код в functions.php с wp_cronПолный контроль, бесплатно, гибкостьНужно писать код, возможны ошибкиКод из статьи выше
Автоматическое создание резервных копий в WordPress: лучшие практические решения
19.11.2025
Автозаполнение категорий и тегов с помощью AI в WordPress
17.12.2025
WooCommerce: автоматическое удаление закрытых и неактивных заказов через код
31.05.2026
Автоматическое добавление атрибутов и вариаций к товарам WooCommerce
25.04.2026
WooCommerce: автоматическое создание уникальных SKU для товаров
09.05.2026