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

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

WooCommerce хранит все заказы в базе данных, включая отменённые и завершённые. Со временем это приводит к разрастанию таблиц, ухудшению производительности и усложнению администрирования. Многие разработчики и владельцы магазинов хотят автоматически очищать базу от старых заказов с определёнными статусами, чтобы оптимизировать сайт. Встроенного инструмента для автоматического удаления заказов по статусу в WooCommerce нет, и популярные плагины часто не подходят из-за избыточности функций или риска потери данных.

Как проверить, что заказы с определёнными статусами есть и их нужно удалить?

Выполните SQL-запрос через phpMyAdmin или WP-CLI для подсчёта заказов по статусу:

SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Обратите внимание на статусы wc-cancelled, wc-completed и другие. Если их много и вы хотите удалить старые, переходите к следующему разделу.

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

Добавим в файл functions.php вашей дочерней темы или в отдельный плагин следующий код, который удалит заказы со статусами «отменён» и «завершён» старше 30 дней, используя WP-Cron.

function wpcore_auto_delete_old_orders() {
    $statuses_to_delete = array('wc-cancelled', 'wc-completed');
    $days_old = 30;
    $date_cutoff = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    foreach ($statuses_to_delete as $status) {
        $orders = get_posts(array(
            'post_type'      => 'shop_order',
            'post_status'    => $status,
            'date_query'     => array(
                array(
                    'before' => $date_cutoff,
                    'inclusive' => true,
                ),
            ),
            'posts_per_page' => -1,
            'fields'         => 'ids',
        ));

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

// Регистрация задачи в WP-Cron, если ещё не зарегистрирована
if (!wp_next_scheduled('wpcore_daily_order_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpcore_daily_order_cleanup');
}

add_action('wpcore_daily_order_cleanup', 'wpcore_auto_delete_old_orders');

Этот код будет запускаться ежедневно и удалять заказы, соответствующие критериям.

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

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

add_action('init', function() {
    if (isset($_GET['wpcore_test_cleanup'])) {
        wpcore_auto_delete_old_orders();
        exit('Cleanup done');
    }
});

И перейти по URL https://ваш_сайт/?wpcore_test_cleanup.

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

  • Повторите SQL-запрос из раздела диагностики, чтобы увидеть уменьшение количества заказов с нужными статусами.
  • Проверьте админку WooCommerce: старые отменённые и завершённые заказы должны исчезнуть.
  • Убедитесь, что свежие заказы остаются без изменений.

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает. Для теста запустите вручную, как описано выше. Убедитесь, что код подключается и не содержит синтаксических ошибок.
  • Удаляются нужные заказы: Проверьте временной фильтр $days_old. Возможно, он установлен слишком большим или малым. Скорректируйте дату.
  • Проблемы с производительностью при большом количестве заказов: Ограничьте количество удаляемых заказов за один запуск, добавив параметр 'posts_per_page' => 100 и реализуйте пагинацию.
  • Удаление не происходит из-за прав: Убедитесь, что пользователь с правами администратора или серверный процесс может удалять записи.

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

  • Удаляйте заказы только с подтверждёнными статусами — не трогайте заказы в процессе оформления.
  • Создайте резервную копию базы перед внедрением автоматического удаления.
  • Добавьте логирование в функцию удаления для отслеживания удалённых заказов, например, через error_log() или сервисы логирования.
  • Если на сайте большой трафик, рассчитайте нагрузку на WP-Cron и при необходимости используйте системный cron через WP-CLI.
  • Регулярно проверяйте таблицы базы данных и оптимизируйте их через инструменты типа WP-CLI или phpMyAdmin.

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

МетодПлюсыМинусыКогда использовать
Плагины управления заказамиПростота использования, UI для выбораПерегрузка функционала, риск ошибок, нагрузкаДля админов без навыков кода
Ручное удаление через SQLБыстро, прямой контрольРиск потери данных, необходимость навыковДля опытных разработчиков, единичные случаи
Автоматический WP-Cron скрипт (код)Автоматизация, гибкость, без лишних плагиновНужно писать и тестировать код, требует контроляДля разработчиков и сайтов с большим объёмом заказов
Как создать автоматическое отправление email при новом комментарии в WordPress
21.02.2026
WooCommerce: как автоматически удалять неактивные вариации товаров без плагинов
04.06.2026
Автоматическое удаление старых записей в WordPress через Cron с примерами кода
29.03.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров по дате без плагинов
24.07.2026
WooCommerce: как автоматически удалять неактивные вариации товаров без плагинов
05.07.2026