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

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

Интернет-магазины на WooCommerce с большим объемом заказов могут столкнуться с замедлением работы сайта из-за большого количества устаревших или неактивных заказов. Особенно это актуально для заказов, которые не были оплачены или отменены, а также для заказов со статусом «в ожидании» или «отменён». Ручное удаление таких заказов неудобно и занимает много времени.

Автоматизация удаления заказов по определённым статусам и дате создания помогает поддерживать базу данных в порядке и улучшать производительность сайта.

Как проверить текущую ситуацию с заказами в WooCommerce

  • В админке WordPress перейдите в WooCommerce > Заказы.
  • Отфильтруйте заказы по статусу, например «в ожидании оплаты» или «отменён».
  • Обратите внимание на дату создания заказов — есть ли много старых заказов, которые можно удалить.

Также можно проверить количество заказов в базе напрямую через phpMyAdmin запросом:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';

Замените wp_ на ваш префикс таблиц и wc-pending на нужный статус.

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

Добавим функцию в файл functions.php вашей темы или в кастомный плагин, которая будет запускаться по расписанию и удалять заказы старше заданного срока и с определённым статусом.

function wponline_delete_old_orders() {
    $statuses_to_delete = array('wc-pending', 'wc-cancelled', 'wc-failed'); // Статусы для удаления
    $days_old = 30; // Удалять заказы старше 30 дней

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

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses_to_delete,
        'date_query'     => array(
            array(
                'column'   => 'post_date',
                'before'   => $date_threshold,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $query = new WP_Query($args);

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

// Регистрируем ежедневное событие, если ещё не зарегистрировано
if (!wp_next_scheduled('wponline_delete_old_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'wponline_delete_old_orders_hook');
}

// Хук для запуска функции
add_action('wponline_delete_old_orders_hook', 'wponline_delete_old_orders');

Объяснение кода

  • $statuses_to_delete — массив статусов заказов, которые нужно удалить.
  • $days_old — возраст заказа в днях, старше которого он будет удалён.
  • Используется WP_Query для выборки заказов по статусу и дате старше порога.
  • Функция wp_delete_post удаляет заказ без перемещения в корзину.
  • Создаётся планировщик событий WP-Cron, запускающий функцию ежедневно.

Как проверить, что удаление работает

  • Перед добавлением кода сделайте резервную копию базы данных.
  • В админке WooCommerce проверьте количество заказов со статусами из массива $statuses_to_delete.
  • После 24 часов проверьте, удалились ли заказы старше указанного срока.
  • Для теста можно вручную запустить функцию, вызвав в functions.php wponline_delete_old_orders(); и проверить результат.
  • Проверяйте логи ошибок PHP на предмет сбоев.

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

  • Удаление не происходит: Проверьте, что событие WP-Cron запланировано (используйте плагин WP Crontrol).
  • Удаляются заказы, которые не должны: Проверьте правильность массива статусов и даты в коде.
  • Проблемы с правами доступа: Убедитесь, что у PHP достаточно прав на удаление записей в базе.
  • Перегрузка сервера при большом количестве заказов: Разбейте удаление на части, добавив пагинацию и обработку по 50 заказов за раз.

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

  • Всегда делайте резервные копии базы перед автоматическим удалением данных.
  • Тестируйте код на тестовом сервере, чтобы избежать потери данных.
  • Если заказов очень много, используйте пакетную обработку с лимитом.
  • Для надежности используйте WP Crontrol для контроля и ручного запуска cron-событий.
  • Для более гибкой настройки рассмотрите вариант добавления админ-панели для задания статусов и срока удаления.

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

СпособПлюсыМинусы
Код через WP-Cron (как в статье)Полный контроль, бесплатно, без сторонних плагиновНужны навыки PHP, требуется тестирование
Плагины для очистки базы (например, WP-Sweep)Простая настройка, интерфейсМогут удалять не только заказы, риск потери данных
Ручное удаление через админку WooCommerceПростота, безопасностьНе подходит для больших объемов, требует времени
WooCommerce: автоматическое отключение способов оплаты при проблемах с интернет-соединением
20.06.2026
Как отключить автоматические обновления в WordPress
30.01.2026
WordPress: как создать собственную таблицу в базе данных и работать с ней
30.11.2025
Автоматическое удаление старых записей в WordPress по дате публикации
03.02.2026
Как удалить файлы из медиабиблиотеки WordPress правильно
10.11.2025