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

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

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

Диагностика проблемы

Чтобы проверить, есть ли в базе избыточные заказы, выполните запрос к базе данных:

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

Это покажет количество заказов по статусам. Если вы видите тысячи заказов со статусами wc-cancelled, wc-failed или wc-completed, стоит рассмотреть автоматическое удаление или архивирование.

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

Решение — добавить PHP-функцию в файл functions.php вашей темы или в кастомный плагин, которая будет запускаться по расписанию через WP-Cron.

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

function wps_delete_old_orders() {
    // Параметры: статусы и дата
    $statuses = array('wc-cancelled', 'wc-failed'); // статусы для удаления
    $days = 30; // количество дней хранения

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-" . $days . " days")),
    );

    foreach ($statuses as $status) {
        $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)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // true — без перемещения в корзину
            }
        }
    }
}

Шаг 2. Добавляем крон-задачу для регулярного запуска

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

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

add_action('wps_delete_old_orders_hook', 'wps_delete_old_orders');

Шаг 3. Как отменить задачу при необходимости

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

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

Для проверки выполните следующие действия:

  • Выполните SQL-запрос из раздела диагностики до запуска задачи.
  • Запустите функцию вручную: wps_delete_old_orders(); через консоль WP-CLI (wp eval 'wps_delete_old_orders();') или временно вызовите её в коде.
  • Снова выполните запрос к базе — количество заказов с указанными статусами и старше 30 дней должно уменьшиться.
  • Проверьте в админке WooCommerce, что удалённые заказы исчезли.

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

  • Функция не запускается по расписанию: проверьте, активирован ли wp-cron (запрос в браузере yoursite.com/wp-cron.php?doing_wp_cron), и не отключён ли он в wp-config.php.
  • Заказы не удаляются: убедитесь, что статусы указаны с префиксом wc- (например, wc-cancelled), и функция wp_delete_post вызывается с параметром true для полного удаления.
  • Удаляются не те заказы: проверьте параметры даты и статус в запросе get_posts, а также формат даты в date_query.
  • Проблемы с производительностью при большом количестве заказов: вместо posts_per_page = -1 используйте постраничную обработку, чтобы не перегружать память.

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

  • Создайте резервную копию базы перед запуском автоматического удаления.
  • Реализуйте постраничную обработку, если заказов очень много, например, по 100 за раз.
  • Добавьте проверку текущих прав пользователя, если вызываете функцию из административного интерфейса.
  • Логируйте удалённые заказы в файл для аудита.
  • Для управления задачами WP-Cron используйте плагин WP Crontrol для мониторинга и отладки.

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

МетодПлюсыМинусы
Удаление вручную через админку WooCommerceПросто, не требует кодаМного времени при большом количестве заказов
SQL-запросы напрямую к базеБыстрое удалениеРиск повредить данные, требует знаний SQL
Автоматизация через WP-Cron + PHP-кодАвтоматически очищает, гибко настраиваетсяТребует написания и тестирования кода
Плагины для очистки WooCommerce (например, WP Sweep)Упрощают процессМогут удалять ненужные данные, риск ошибок
Как сделать автоматическую сборку и оптимизацию CSS в WordPress
22.01.2026
Автоматический импорт пользователей из CSV в WordPress: пошаговое руководство
02.03.2026
WooCommerce: как автоматически удалять заказы после их архивирования
10.05.2026
Как добавить настройку автозагрузки медиафайлов в WordPress
26.02.2026
Как сделать автоматический rollback обновлений WordPress при ошибках
31.12.2025