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

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

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

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

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

Для начала напишем функцию, которая удалит заказы с заданным статусом, созданные старше определённого количества дней.

function wpb_delete_old_orders_by_status( $days = 30, $status = 'cancelled' ) {
    $args = [
        'limit' => -1,
        'status' => $status,
        'date_created' => '<' . ( time() - ( DAY_IN_SECONDS * $days ) ),
        'return' => 'ids',
    ];

    $orders = wc_get_orders( $args );

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

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

    return count( $orders );
}

2. Запуск функции с помощью WP-Cron

Чтобы удаление происходило автоматически, подключим функцию к планировщику задач WordPress.

add_action( 'wpb_delete_old_orders_event', 'wpb_delete_old_orders_cron' );

function wpb_delete_old_orders_cron() {
    $deleted = wpb_delete_old_orders_by_status( 30, 'cancelled' );
    if ( $deleted ) {
        error_log( "Удалено $deleted заказов со статусом 'cancelled' старше 30 дней." );
    }
}

// Регистрируем событие при активации темы или плагина
if ( ! wp_next_scheduled( 'wpb_delete_old_orders_event' ) ) {
    wp_schedule_event( time(), 'daily', 'wpb_delete_old_orders_event' );
}

// Очистка при деактивации
function wpb_deactivation_cleanup() {
    wp_clear_scheduled_hook( 'wpb_delete_old_orders_event' );
}
register_deactivation_hook( __FILE__, 'wpb_deactivation_cleanup' );

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

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

  • Перейдите в админку WooCommerce → Заказы и проверьте наличие заказов с указанным статусом старше 30 дней.
  • Проверьте лог ошибок PHP (error_log) на наличие записей об удалении заказов.
  • Выполните вручную функцию wpb_delete_old_orders_by_status с меньшим интервалом дней для теста через WP-CLI или подключив временно вызов в код.

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

  • Отсутствие записей в error_log: убедитесь, что логирование ошибок включено, либо используйте альтернативный способ уведомления (email, запись в отдельный файл).
  • Функция не вызывается по расписанию: проверьте, что WP-Cron работает (например, через плагин WP Crontrol). Если сайт с низким трафиком, рассмотрите настройку системного cron для вызова wp-cron.php.
  • Заказы не удаляются: проверьте, что статус у заказов совпадает с указанным в функции, и что заказы старше нужного срока.
  • Удаление не полное: wp_delete_post с вторым параметром true удаляет заказ и все связанные данные. Если заказ связан с внешними плагинами, проверьте совместимость.

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

  • Всегда делайте резервные копии базы данных перед внедрением автоматического удаления данных.
  • Ограничивайте удаление только статусами, которые точно не нужны (например, cancelled, failed), чтобы не потерять важные данные.
  • Используйте WP-Cron с интервалом не чаще одного раза в сутки, чтобы не нагружать сервер.
  • Для больших магазинов с тысячами заказов используйте пагинацию при выборке заказов, чтобы избежать превышения лимита памяти и таймаутов.

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

МетодПлюсыМинусы
Плагин (например, WP Bulk Delete)Простота настройки, UIМожет быть избыточным, нагрузка на БД при больших данных
Кастомный код и WP-CronГибкость, минимальная нагрузкаТребует навыков, риск ошибок при некорректном коде
Ручное удаление через админкуБезопасно, контрольРучной труд, не подходит для больших объёмов
WooCommerce: автоматическое удаление неактивных клиентов через код
04.07.2026
Как сделать автоматическое сохранение изменений в WordPress для кастомных типов записей
18.01.2026
WooCommerce: Автоматическое удаление вариантов товаров по условию через код
17.06.2026
Как создать собственный плагин для автоматического удаления старых постов в WordPress
15.04.2026
Как создать пошаговую многошаговую форму в WordPress без плагинов
27.02.2026