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

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

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

Проверить накопление неактуальных заказов можно через админ-панель WooCommerce: перейти в раздел Заказы, отфильтровать по статусу (например, отменённые или ожидающие оплаты) и посмотреть дату создания. Если таких заказов много и они старше 30-60 дней, стоит задуматься об автоматическом удалении.

Пошаговое решение: как автоматизировать удаление заказов без плагинов

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

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

function wc_delete_old_orders_by_status( $status = 'cancelled', $days_old = 30 ) {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return;
    }

    $args = [
        'status' => $status,
        'limit' => -1,
        'date_created' => '<' . ( time() - ( DAY_IN_SECONDS * $days_old ) ),
        'return' => 'ids',
    ];

    $orders = wc_get_orders( $args );

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

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

2. Автоматизация через WP-Cron

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

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

add_action( 'wc_daily_delete_old_orders', function() {
    // Удаляем отменённые заказы старше 30 дней
    wc_delete_old_orders_by_status( 'cancelled', 30 );
    // Удаляем ожидающие оплаты заказы старше 7 дней
    wc_delete_old_orders_by_status( 'pending', 7 );
});

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

Чтобы удостовериться, что код работает:

  • Перейдите в WooCommerce > Заказы и отфильтруйте по статусам, которые вы указали для удаления.
  • Проверьте, что заказы старше указанного периода отсутствуют.
  • Запустите WP-Cron вручную, если хотите проверить прямо сейчас, добавив в functions.php временный вызов do_action('wc_daily_delete_old_orders'); и затем удалите его после проверки.
  • Проверьте логи сервера на наличие ошибок, если заказы не удаляются.

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

  • Заказы не удаляются: возможно, WP-Cron не запускается из-за отсутствия трафика или конфликтов. Запустите вручную с do_action('wc_daily_delete_old_orders'); и проверьте ошибки PHP.
  • Удаляются не те статусы: убедитесь, что передаёте правильные статусы. Статусы WooCommerce чувствительны к регистру и должны быть валидными, например: cancelled, pending, failed.
  • Функция wc_get_orders не найдена: проверьте, что WooCommerce активен и загружен до вызова функции.
  • Нельзя удалить заказ из-за ограничений хостинга: проверьте права на удаление в базе данных и ограничения хостинга на длительные запросы.

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

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

Сравнение вариантов: плагин vs код vs компромисс

ПодходПреимуществаНедостатки
Плагин (например, WP Bulk Delete)Простота настройки, GUI, дополнительные опцииДополнительная нагрузка, возможны конфликты, зависимость от обновлений
Код (как в статье)Лёгкий, настраиваемый, не требует сторонних зависимостейТребует навыков, возможны ошибки при некорректной доработке
Компромисс (код + сторонние утилиты для cron)Контроль и стабильность автоматизации, минимальная нагрузкаНеобходима настройка сервера, чуть сложнее внедрение
Как отключить автозаполнение форм в WordPress
07.01.2026
WP-Cron проблемы и решения: как правильно настроить и оптимизировать WordPress задачи
19.11.2025
Автоматическое создание записей из внешних источников в WordPress
15.12.2025
Как удалить все комментарии от определённого автора в WordPress
23.11.2025
WooCommerce: автоматическое удаление заказов по статусу и срокам без плагинов
19.06.2026

Сайт в разработке, скоро здесь будет портал о WordPress.