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

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

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

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

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

Как проверить наличие проблемы

В админке WooCommerce перейдите в раздел Заказы и отсортируйте заказы по дате. Обратите внимание на количество старых заказов с неактуальными статусами. Также можно выполнить SQL-запрос к базе данных для оценки объёма:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Если число заказов велико (сотни и тысячи), стоит рассмотреть автоматическую очистку.

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

1. Создаём функцию удаления заказов

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

function wpt_delete_old_orders() {
    $statuses_to_delete = array('cancelled', 'failed', 'pending'); // Статусы заказов для удаления
    $days_to_keep = 30; // Кол-во дней, после которых заказы удаляются

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-' . $status,
            'date_query'     => array(
                'before' => date('Y-m-d', strtotime("-{$days_to_keep} days"))
            ),
            'posts_per_page' => -1,
            'fields'         => 'ids',
            'no_found_rows'  => true,
        );

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление
            }
        }
    }
}

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

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

add_action('wpt_daily_order_cleanup', 'wpt_delete_old_orders');

3. Добавляем возможность ручного запуска из админки (опционально)

Для удобства можно добавить страницу с кнопкой для запуска очистки вручную:

function wpt_cleanup_admin_menu() {
    add_submenu_page(
        'woocommerce',
        'Очистка заказов',
        'Очистка заказов',
        'manage_woocommerce',
        'wpt-cleanup-orders',
        'wpt_cleanup_orders_page'
    );
}
add_action('admin_menu', 'wpt_cleanup_admin_menu');

function wpt_cleanup_orders_page() {
    if (isset($_POST['wpt_cleanup_run'])) {
        wpt_delete_old_orders();
        echo '<div class="notice notice-success is-dismissible">Очистка заказов выполнена.</div>';
    }
    ?>
    <div class="wrap">
        <h1>Очистка старых заказов WooCommerce</h1>
        <form method="post">
            <input type="hidden" name="wpt_cleanup_run" value="1" />
            <input type="submit" class="button button-primary" value="Удалить старые заказы" />
        </form>
    </div>
    <?php
}

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

1. Проверьте, что ежедневно в wp-cron запускается событие wpt_daily_order_cleanup. Для этого можно использовать плагин WP Crontrol.

2. После запуска функции заказы со статусами из массива $statuses_to_delete старше 30 дней должны исчезать из админки.

3. При ручном запуске из админки вы должны увидеть уведомление об успешной очистке, а заказы должны удалиться сразу.

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

  • Отсутствие удаления заказов: Проверьте правильность статусов заказов. Например, в WooCommerce статус 'pending' соответствует 'wc-pending' в базе.
  • WP-Cron не срабатывает: Ваш сайт может не получать трафик, из-за чего WP-Cron не запускается. Решение — настроить системный cron или запускать WP-Cron вручную.
  • Заказы не удаляются полностью: Функция wp_delete_post($order_id, true) удаляет заказ без возможности восстановления. Если параметр true опущен, заказ попадёт в корзину.
  • Удаление нужных заказов: Внимательно проверьте, что в массиве $statuses_to_delete нет статусов, которые важны для вашего бизнеса.

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

  • Перед удалением заказов сделайте резервную копию базы данных.
  • Запускайте удаление партиями, если заказов много, чтобы избежать таймаутов:
// Добавьте параметр 'posts_per_page' => 100 и используйте пагинацию в цикле
  • Используйте плагин Clearfy Pro для дополнительной оптимизации и очистки базы данных.
  • Регулярно проверяйте логи ошибок и производительность сайта после внедрения автоматизации.

Сравнение вариантов удаления заказов

МетодПреимуществаНедостатки
Плагины для очистки WooCommerceПростая установка, готовый интерфейсМогут нагружать сайт, не всегда гибкие настройки
WP-Cron с пользовательским кодомПолный контроль, интеграция с бизнес-логикойТребует навыков разработки, возможны ошибки при неправильной настройке
Ручное удаление через админкуБезопасно, можно контролировать процессНе подходит для больших объёмов заказов
Как создать динамические виджеты в WordPress с использованием REST API
11.01.2026
Как создать собственный плагин в WordPress
10.11.2025
WooCommerce: автоматическое создание заказа при оплате во внешней платежной системе
31.05.2026
Не работает обновление статуса заказа в WooCommerce: диагностика и решение
21.04.2026
Как создать динамический файловый кеш в WordPress с использованием Transients API
20.02.2026