Автоматическое удаление заказов 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 для кастомизации функциональности
17.03.2026
Как правильно использовать сети REST API в WordPress для сложных проектов
07.01.2026
Как создать динамический фильтрованный список постов в WordPress с помощью WP_Query
02.02.2026
Как удалить плагин без ошибок в WordPress
20.11.2025
Автоматическое отключение отзывов для отдельных товаров WooCommerce
03.06.2026