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

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

Большие интернет-магазины на WooCommerce часто сталкиваются с проблемой перегрузки базы данных из-за накопления устаревших или неактивных заказов. Заказы со статусами cancelled, failed или refunded, которые не имеют смысла для отчетности спустя длительное время, занимают место и замедляют работу магазина. Ручное удаление заказов — трудоемкий процесс и риск ошибок. Автоматизация удаления заказов по статусу и дате поможет поддерживать базу данных в оптимальном состоянии без потери нужной информации.

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

Обзор подхода

Решение заключается в создании WP-Cron задачи, которая будет запускаться регулярно (например, ежедневно) и удалять заказы с определёнными статусами, старше заданного количества дней. Для этого используем стандартные функции WordPress и WooCommerce, без сторонних плагинов.

Пошаговое решение с примерами кода

1. Добавляем функцию удаления заказов в файл functions.php темы или в кастомный плагин:

function wpdir_delete_old_orders() {
    // Статусы заказов, которые подлежат удалению
    $statuses = array('cancelled', 'failed', 'refunded');
    // Удаляем заказы старше 30 дней
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array_map(function($status) { return 'wc-' . $status; }, $statuses),
        'date_query'     => array(
            array(
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

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

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - без перемещения в корзину
    }
}

2. Регистрируем WP-Cron событие для ежедневного запуска:

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

add_action('wpdir_daily_order_cleanup', 'wpdir_delete_old_orders');

3. Удаляем расписание при деактивации плагина или темы (если вы используете плагин для этого кода):

function wpdir_clear_order_deletion_schedule() {
    $timestamp = wp_next_scheduled('wpdir_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpdir_daily_order_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpdir_clear_order_deletion_schedule');

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

Для проверки, что автоудаление работает:

  • Создайте тестовый заказ со статусом cancelled или failed, установите дату создания старше 30 дней (для теста можно уменьшить порог дней в коде).
  • Запустите вручную крон-задачу с помощью WP CLI:
    wp cron event run wpdir_daily_order_cleanup
  • Проверьте, что заказ удален из админки WooCommerce (Заказы).

Также можно добавить логирование в функцию удаления для отладки:

function wpdir_delete_old_orders() {
    // ... код из предыдущего примера ...
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
        error_log("Удалён заказ ID: {$order_id}");
    }
}

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

  • Крон-задача не срабатывает: Проверьте, что на сайте активен WP-Cron (например, не отключен константой DISABLE_WP_CRON). Можно запускать крон вручную через WP CLI или по системному cron.
  • Заказы не удаляются: Убедитесь, что статусы заказов корректно указаны с префиксом wc- (например, wc-cancelled), и дата заказа действительно старше порогового значения.
  • Удаление происходит не сразу: WP-Cron запускается только при посещении сайта, для критичных задач настройте системный cron на сервере.
  • Ошибки прав доступа: Проверьте, что скрипт запускается с нужными правами, и в базе нет ограничений на удаление.

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

  • Безопасность: Удаление заказов — необратимая операция. Рекомендуется создавать резервные копии базы перед активацией автоматического удаления.
  • Производительность: Если заказов много, разбивайте удаление на партии (например, по 50 заказов за один запуск), чтобы не перегружать сервер.
  • Логирование: Введите лог-файл для мониторинга удалений, чтобы быстро выявлять возможные ошибки.
  • Интеграция с Clearfy Pro: Для комплексной оптимизации WooCommerce и очистки базы можно использовать плагин Clearfy Pro, который поможет управлять производительностью и безопасностью.

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

Метод Плюсы Минусы Рекомендации
Код в functions.php или кастомном плагине Контроль, нет сторонних зависимостей, гибкость Требует навыков разработки, ответственность за безопасность Лучше для опытных разработчиков, при небольших магазинах
Плагины очистки WooCommerce (например, Clearfy Pro) Простота настройки, дополнительные функции оптимизации Может нагрузить сайт, зависит от обновлений плагина Рекомендуется для крупных магазинов и тех, кто хочет комплексное решение
Как автоматизировать сборку данных с помощью AJAX в WordPress
04.04.2026
Как удалить или изменить URL страницы в WordPress без перенаправления
19.01.2026
Как отключить Gutenberg и оставить классический редактор в WordPress
06.12.2025
Как добавить свой shortcode в WordPress
03.11.2025
Как удалить или заблокировать доступ по IP в WordPress
25.02.2026