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

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

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

Диагностика: как проверить, что заказы действительно архивируются

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

  • Проверьте, существует ли пользовательский статус заказа, например wc-archived или похожий.
  • Если нет, определите мета-поле, которое отвечает за архивацию, например _is_archived.
  • Для проверки используйте SQL-запрос к базе или REST API WooCommerce.

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

1. Определяем критерий архивации

Для примера предположим, что у вас есть кастомный статус заказа archived. Если статус другой, замените его в коде.

2. Создаём cron-задачу для автоматического удаления

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

function wc_delete_archived_orders() {
    // Получаем заказы со статусом archived
    $args = array(
        'status' => 'archived',
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);

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

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // Перемещаем заказ в корзину, можно заменить на wp_delete_post для полного удаления
    }
}

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

add_action('wc_delete_archived_orders_hook', 'wc_delete_archived_orders');

3. Добавляем функцию для очистки корзины заказов (опционально)

Заказы в корзине не удаляются автоматически. Можно добавить периодическую очистку корзины заказов:

function wc_empty_orders_trash() {
    global $wpdb;
    $order_post_type = 'shop_order';
    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = 'trash'",
        $order_post_type
    );
    $order_ids = $wpdb->get_col($query);

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // Полное удаление
    }
}

// Добавляем очистку корзины заказов раз в неделю
if (!wp_next_scheduled('wc_empty_orders_trash_hook')) {
    wp_schedule_event(time(), 'weekly', 'wc_empty_orders_trash_hook');
}

add_action('wc_empty_orders_trash_hook', 'wc_empty_orders_trash');

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

  • Убедитесь, что заказы с нужным статусом удаляются после запуска cron. Для теста можно вручную вызвать функцию wc_delete_archived_orders() через консоль WP-CLI или добавить временный вызов в код.
  • Проверьте наличие заказов с этим статусом в админке WooCommerce — они должны исчезнуть или перейти в корзину.
  • Проверьте таблицу wp_posts в базе данных для подтверждения удаления заказов.

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

  • Неверный статус заказа: используйте функцию wc_get_order_statuses() для просмотра всех доступных статусов и убедитесь, что используете правильный.
  • Отсутствие cron-задачи: проверьте, что событие wc_delete_archived_orders_hook зарегистрировано через wp_next_scheduled(). Если нет, попробуйте вручную вызвать функцию или использовать плагин WP Crontrol для диагностики.
  • Заказы не удаляются полностью: wp_trash_post() перемещает заказ в корзину, для полного удаления используйте wp_delete_post($order_id, true).
  • Права пользователя: при вызове функций удаления убедитесь, что код запускается с достаточными правами, иначе удаление может не сработать.

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

  • Не удаляйте заказы сразу без резервного копирования — лучше сначала перемещать их в корзину.
  • Если на сайте много заказов, делайте удаление пакетами (например, по 50 заказов за раз), чтобы избежать таймаутов.
  • Используйте WP-Cron только на сайтах с регулярным трафиком, иначе настройте системный cron для запуска WP-Cron.
  • Логируйте результаты удаления в отдельный файл или через системные логи для мониторинга.

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

МетодПреимуществаНедостатки
wp_trash_post()Безопасно, можно восстановить заказЗаказы остаются в корзине, база не очищается полностью
wp_delete_post(true)Полное удаление, освобождает место в базеНельзя восстановить, риск потери данных
Удаление через SQL-запросМаксимальная скоростьРиск повреждения данных, требует аккуратности
Добавление поддержки масштабирования изображений в WordPress
23.02.2026
Оптимизация загрузки картинок в WordPress с помощью Lazy Load
15.01.2026
Уникальный хештег для WordPress: создание и применение
09.11.2025
Как добавить AJAX фильтрацию товаров в WordPress для малого бизнеса
14.03.2026
Как удалить метаданные заказа WooCommerce из базы после его закрытия
24.04.2026