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

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

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

Задача: настроить автоматическое удаление заказов, которые переведены в статус архивированных (например, custom статус archived или стандартный completed с дополнительной проверкой), через определённый период после архивирования.

Настройка автоматического удаления заказов в WooCommerce

1. Проверка текущих статусов заказов

По умолчанию WooCommerce не имеет статуса archived. Нужно убедиться, какой статус используется для пометки архивных заказов. Чаще всего используется статус completed или настраиваемый статус.

Для проверки статусов выполните в консоли WP или через плагин WP-CLI:

wp post list --post_type=shop_order --fields=ID,post_status --posts_per_page=10

Или в коде сделать вывод статусов заказов:

function get_order_statuses() {
    $statuses = wc_get_order_statuses();
    print_r($statuses);
}
add_action('admin_init', 'get_order_statuses');

2. Добавление WP-Cron задачи для удаления заказов

Создадим задачу, которая будет запускаться ежедневно и удалять заказы старше X дней в статусе архивирования. Ниже пример для статуса completed и срока 30 дней.

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

    $args = array(
        'limit' => -1,
        'status' => 'completed',
        'date_created' => $date_query,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

add_action('wps_daily_delete_orders', 'wps_delete_old_completed_orders');

// Планируем событие, если еще не запланировано
if (! wp_next_scheduled('wps_daily_delete_orders')) {
    wp_schedule_event(time(), 'daily', 'wps_daily_delete_orders');
}

Если вы используете кастомный статус, например archived, замените 'status' => 'completed' на 'status' => 'archived'.

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

Чтобы проверить, что удаление работает:

  • Создайте тестовый заказ и переведите его в нужный статус (например, completed).
  • Измените дату заказа в базе (через SQL) на дату старше 30 дней, например:
UPDATE wp_posts SET post_date = '2023-01-01 00:00:00', post_date_gmt = '2023-01-01 00:00:00' WHERE ID = 123;
  • Запустите событие вручную, например через WP-CLI:
wp cron event run wps_daily_delete_orders
  • Убедитесь, что заказ удалён из админки и из базы (проверка через wp-admin и SQL).

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

  • Заказы не удаляются: Возможно, событие WP-Cron не запускается. Проверьте, работает ли WP-Cron на сайте. Для теста можно вызвать функцию удаления вручную.
  • Неверный статус заказа: Убедитесь, что статус, указанный в запросе, действительно используется на сайте. Поищите кастомные статусы в настройках или в коде.
  • Отсутствие прав на удаление: Функция wp_delete_post с параметром true удаляет пост полностью. Если по каким-то причинам удаление блокируется, проверьте роли и права пользователя, под которым выполняется код.
  • Большая нагрузка при удалении: При большом количестве заказов удаляйте партиями, чтобы избежать таймаута. Добавьте лимит и пагинацию.

Оптимизация и безопасность при удалении заказов

  • Резервное копирование: Перед автоматическим удалением любых данных обязательно настройте резервное копирование базы.
  • Удаление партиями: Для больших магазинов ограничьте количество удаляемых заказов за один запуск, например 'limit' => 50, и используйте повторный запуск события.
  • Логирование: Добавьте логирование удалённых заказов для аудита и отладки.
  • Защита от случайных удалений: Добавьте проверку на мета-данные или дополнительные условия, чтобы точно удалять только ненужные заказы.

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

МетодОписаниеПлюсыМинусы
WP-Cron + кастомный кодЧерез wp_schedule_event и wc_get_orders удалять заказы по статусу и датеГибко, без сторонних плагинов, можно точно настроитьНужно писать и тестировать код, зависит от правильной работы WP-Cron
Плагин очистки базыГотовые решения для удаления старых заказов и ревизийПростота установки, поддержка обновленийМожет удалять слишком много, не всегда гибко под кастомные статусы
SQL скрипты в cron на сервереЗапуск SQL запросов напрямую на базеМаксимальная скорость и контрольРиск ошибок, требует навыков работы с SQL и доступа к серверу
Как отключить XML-RPC в WordPress и защитить сайт от атак
27.01.2026
Как создать автоматический импорт постов из RSS в WordPress
10.03.2026
WooCommerce: как автоматически изменять стоимость товара при определённых условиях
26.05.2026
Как создать собственный shortcode в WordPress с примером кода
03.12.2025
Как удалить пустые категории в WordPress с помощью кода
08.04.2026