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

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

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

Чтобы оценить текущую ситуацию, выполните SQL-запрос к базе данных через phpMyAdmin или WP-CLI:

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

Так вы увидите распределение заказов по статусам. Если заказы с определёнными статусами (например, 'wc-cancelled', 'wc-failed') копятся и не нужны, можно их автоматизировать для удаления.

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

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

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

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

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses_to_delete,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                '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); // Полное удаление
    }
}

2. Запускаем функцию по расписанию через WP-Cron

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

if (!wp_next_scheduled('wpdir_daily_delete_old_orders')) {
    wp_schedule_event(time(), 'daily', 'wpdir_daily_delete_old_orders');
}

add_action('wpdir_daily_delete_old_orders', 'wpdir_delete_old_orders');

3. Очистка WP-Cron (при необходимости)

Если вы меняете параметры или тестируете, можно сбросить событие:

$timestamp = wp_next_scheduled('wpdir_daily_delete_old_orders');
if ($timestamp) {
    wp_unschedule_event($timestamp, 'wpdir_daily_delete_old_orders');
}

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

  • Проверьте наличие заказов с указанными статусами и датой старше 30 дней до запуска скрипта.
  • Запустите функцию вручную, вызвав wpdir_delete_old_orders() через WP-CLI или временно через админку.
  • Проверьте, что заказы удалены из базы wp_posts и связанных таблиц (например, wp_postmeta).
  • Через сутки убедитесь, что WP-Cron сработал — в логах сервера или с помощью плагина WP Crontrol.

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

  • Заказы не удаляются: Проверьте, что статусы указаны правильно с префиксом wc- (например, wc-cancelled), иначе get_posts не найдёт заказов.
  • Скрипт удаляет лишние заказы: Убедитесь, что фильтр по дате корректен, чтобы не удалять свежие заказы.
  • WP-Cron не запускается автоматически: Поскольку WP-Cron зависит от посещений сайта, для надёжности настраивайте системный cron на вызов wp-cron.php или запускайте вручную.
  • Производительность: Если заказов много, удаляйте порциями, чтобы не перегружать сервер.

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

  • Всегда делайте резервную копию базы перед автоматическим удалением.
  • Для больших магазинов используйте пакетную обработку с лимитом, например posts_per_page = 50, чтобы избежать таймаутов.
  • Удаление заказов влияет на отчёты и статистику — учитывайте это в бизнес-процессах.
  • Для надёжности логируйте ID удалённых заказов в файл или системный лог.

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

МетодПлюсыМинусыКогда использовать
Плагин (например, WP Bulk Delete) Простота настройки, интерфейс Зависимость от стороннего кода, нагрузка Для администраторов без навыков программирования
Кастомный скрипт с WP-Cron Гибкость, контроль, оптимизация под задачи Требует знаний PHP и WordPress API Для разработчиков и больших проектов
Ручное удаление через базу или админку Простота без автоматизации Трудоёмко, риск ошибок В редких случаях, при небольшом количестве заказов
Как создать удобную настройку для плагина WordPress в админке с примерами кода
03.01.2026
Как создать собственный shortcode с аргументами и обработкой формы в WordPress
17.12.2025
Как создать уникальный Metabox в WordPress с примером кода
23.12.2025
WooCommerce: Автоматическое удаление неактивных заказов по дате
19.05.2026
WooCommerce: автоматическое удаление товаров с отсутствующими атрибутами и вариациями
05.07.2026