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

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

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

Как определить заказы для удаления

WooCommerce хранит заказы как записи постов типа shop_order с разными статусами, например:

  • wc-pending — ожидает оплаты;
  • wc-cancelled — отменён;
  • wc-failed — провален;
  • wc-completed — выполнен;
  • wc-processing — обрабатывается.

Для удаления чаще всего выбирают заказы со статусами wc-cancelled или wc-failed, т.к. они неактивны и не несут ценности для аналитики.

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

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

function wpeasy_delete_orders_by_status($status = 'wc-cancelled', $older_than_days = 30) {
    $date_query = array(
        'before' => date('Y-m-d', strtotime("-" . $older_than_days . " days")),
        'inclusive' => true,
    );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $status,
        'date_query'     => array($date_query),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

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

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

    return count($orders);
}

Эта функция удалит все заказы с указанным статусом старше определённого количества дней. По умолчанию — отменённые заказы старше 30 дней.

Пример вызова функции вручную

add_action('init', function() {
    if (isset($_GET['delete_old_cancelled_orders'])) {
        $deleted = wpeasy_delete_orders_by_status('wc-cancelled', 30);
        echo "Удалено заказов: " . $deleted;
        exit;
    }
});

Теперь, перейдя по адресу https://ваш-сайт.ru/?delete_old_cancelled_orders=1, вы запустите удаление заказов. Не оставляйте этот код включённым на продакшене без защиты.

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

  • Перейдите в админку WooCommerce → Заказы и отфильтруйте заказы по нужному статусу.
  • Проверьте, что заказы старше указанного срока исчезли.
  • Можно также проверить таблицу wp_posts в базе данных — записи с post_type = 'shop_order' и соответствующим статусом должны быть удалены.

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

  • Ничего не удаляется: Проверьте правильность статуса — он должен начинаться с wc-, например, wc-cancelled. Статусы без префикса не сработают.
  • Удаление не происходит из-за кеширования: Очистите кеш сайта и браузера, если используете плагины кеширования.
  • Удалённые заказы не удаляются из базы полностью: Используйте wp_delete_post($id, true) с параметром true для полного удаления, а не перемещения в корзину.
  • Удаление запускается на каждом запросе: Не забудьте убрать или защитить от вызова функцию удаления после теста.

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

  • Резервное копирование: Перед массовым удалением заказов обязательно сделайте бэкап базы данных.
  • Пакетное удаление: Если заказов очень много, лучше удалять их пакетами, чтобы избежать таймаутов PHP.
    function wpeasy_delete_orders_batch($status = 'wc-cancelled', $older_than_days = 30, $batch_size = 50) {
        $date_query = array(
            'before' => date('Y-m-d', strtotime("-" . $older_than_days . " days")),
            'inclusive' => true,
        );
    
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => $status,
            'date_query'     => array($date_query),
            'posts_per_page' => $batch_size,
            'fields'         => 'ids',
        );
    
        $orders = get_posts($args);
    
        if (empty($orders)) {
            return 0;
        }
    
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
        }
    
        return count($orders);
    }
  • Безопасный вызов: Используйте WP-CLI для запуска скрипта из командной строки без риска случайного вызова через URL.
  • Автоматизация: Для регулярного удаления можно настроить WP-Cron, но лучше использовать системный cron через WP-CLI, чтобы избежать проблем с пропущенными заданиями.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПросто, не требует кодаМедленно, не массовоМало заказов, единичные случаи
Кодовая функция в functions.phpАвтоматизация, гибкостьТребует навыков, риск ошибокРегулярное удаление, большие объёмы
Плагин для массового удаления заказовУдобный интерфейсМожет быть платным, конфликтоватьДля админов без навыков кода
WP-CLI командаОптимально для больших сайтов, быстрая работаТребует доступа к серверуПрофессиональная администрирование
Как создать многоуровневую навигацию в WordPress с помощью ABC Pagination
04.01.2026
Как создать собственный шорткод в WordPress: практическое руководство
10.11.2025
Отладка медленной загрузки страниц WordPress и оптимизация скриптов
05.03.2026
Как безопасно удалить неиспользуемые мета-поля в WordPress
03.02.2026
Как создать своё устройство для автопостинга в WordPress
17.02.2026