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

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

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

Типичные сценарии:

  • Удаление отменённых заказов старше 30 дней;
  • Удаление заказов со статусом "ожидает оплаты", которые висят более недели;
  • Очистка тестовых заказов после завершения тестирования.

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

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

Ниже пример кода, который находит и удаляет заказы с указанным статусом старше заданного количества дней:

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

    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $query = new WC_Order_Query( array(
        'limit'        => -1,
        'status'       => $status,
        'date_modified' => '<' . $date_threshold,
        'return'       => 'ids',
    ) );

    $order_ids = $query->get_orders();

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

2. Зарегистрируйте WP-Cron событие для периодического запуска

Добавьте хук и функцию планировщика, чтобы запускать очистку ежедневно:

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

add_action( 'wpfind_daily_order_cleanup', function() {
    // Удаляем отменённые заказы старше 30 дней
    wpfind_delete_old_orders( 'cancelled', 30 );

    // Удаляем заказы в ожидании оплаты старше 7 дней
    wpfind_delete_old_orders( 'pending', 7 );
});

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

Чтобы изменения не потерялись при обновлении, лучше использовать дочернюю тему или собственный плагин. Не размещайте код в основной теме напрямую.

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

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

  • Создайте тестовые заказы с нужным статусом и датой изменения старше заданного порога (можно через базу или программно).
  • Запустите событие WP-Cron вручную (например, с помощью плагина WP Crontrol) или дождитесь автоматического запуска.
  • Проверьте, что заказы удалились (их больше нет в админке WooCommerce и в базе wp_posts).
  • Посмотрите логи ошибок сервера и WordPress, чтобы убедиться, что нет сбоев.

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

  • Заказы не удаляются: Проверьте, активен ли WP-Cron и правильно ли зарегистрировано событие. Включите плагин WP Crontrol для диагностики.
  • Удаляются не те заказы: Проверьте аргументы WC_Order_Query, особенно статус и дату. Используйте var_dump для отладки выборки.
  • Большая нагрузка на сервер при удалении: Если заказов много, делайте удаление партиями, добавив лимит в запрос и повторяя процесс.
  • Удаление не происходит из-за прав: Убедитесь, что WordPress имеет права на удаление постов, а пользователь с нужными правами (обычно admin) выполняет задачу.

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

  • Перед удалением рекомендуется создавать резервные копии базы данных.
  • Удаляйте заказы только с тем статусом, который точно не нужен — лучше не удалять статус "завершён" или "обрабатывается".
  • Для больших магазинов используйте пакетное удаление, например, по 50 заказов за раз, чтобы не перегружать базу и сервер.
  • Используйте wp_delete_post( $order_id, true ) с параметром true для полного удаления из базы, а не в корзину.
  • Для мониторинга запуска WP-Cron можно добавить логирование в файл, например:
add_action( 'wpfind_daily_order_cleanup', function() {
    error_log( 'Запуск очистки заказов: ' . date( 'Y-m-d H:i:s' ) );
    wpfind_delete_old_orders( 'cancelled', 30 );
    wpfind_delete_old_orders( 'pending', 7 );
});

Сравнение вариантов решения задачи

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПросто, не требует кодаТрудоёмко, не автоматизированоМаленькие магазины, редкие удаления
Плагин для очистки базыУдобный интерфейс, автоматизацияЗависимость от плагина, возможны конфликтыСредние магазины, без опыта программирования
Код на WP-Cron (предложенный)Гибкость, контроль, легковесностьНужно программировать и тестироватьБольшие магазины, требующие точной настройки
Как использовать хуки для динамического изменения контента в WordPress
20.12.2025
Как удалить пустые категории в WordPress с помощью кода
16.02.2026
Как использовать WP REST API для создания пользовательских endpoint’ов в WordPress
02.04.2026
Как создать динамические фильтры в WordPress с помощью REST API
13.04.2026
Как использовать WPCommunity для создания социальной сети на WordPress
20.02.2026

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