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

Почему важно удалять старые отгруженные заказы в WooCommerce?

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

Диагностика: как определить, что пора чистить старые заказы

  • Рост размера базы данных, особенно таблиц wp_posts и wp_postmeta.
  • Замедленная работа админки при просмотре заказов.
  • Долгое выполнение бэкапов и миграций.
  • Высокое время отклика на REST API запросы к заказам.

Для оценки можно использовать плагины типа Query Monitor и инструменты хостинга для анализа размера таблиц.

Шаги для автоматического удаления заказов со статусом completed, старше 90 дней

1. Написание функции удаления заказов

Используем WP_Cron для регулярного запуска задачи и WC_Order_Query для выборки заказов. Важно удалять заказы через API WooCommerce, чтобы корректно удалить мета-данные и связи.

function wptask_delete_old_completed_orders() {
    $args = array(
        'limit' => -1,
        'status' => 'completed',
        'date_created' => '<' . ( time() - DAY_IN_SECONDS * 90 ),
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // Перемещаем заказ в корзину
    }
}

2. Регистрация wp_cron задачи

Запустим очистку раз в сутки.

function wptask_schedule_delete_old_orders() {
    if (! wp_next_scheduled('wptask_daily_delete_old_orders')) {
        wp_schedule_event(time(), 'daily', 'wptask_daily_delete_old_orders');
    }
}
add_action('wp', 'wptask_schedule_delete_old_orders');

add_action('wptask_daily_delete_old_orders', 'wptask_delete_old_completed_orders');

3. Удаление заказов из корзины (Trash) автоматически

По умолчанию WordPress хранит записи в корзине 30 дней. Можно уменьшить этот срок, добавив в wp-config.php:

define('EMPTY_TRASH_DAYS', 7); // Удалять записи из корзины через 7 дней

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

  • Просмотрите список заказов в WooCommerce — старые completed заказы должны отсутствовать.
  • Проверьте размер таблиц wp_posts и wp_postmeta через phpMyAdmin или админку хостинга — размер должен уменьшиться после нескольких дней работы скрипта.
  • Логи WP-Cron или плагина WP Crontrol покажут, что задача запускается ежедневно без ошибок.
  • Запустите вручную функцию wptask_delete_old_completed_orders() через admin-ajax или WP CLI для тестирования.

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

  • Заказы не удаляются: проверьте, активен ли WP-Cron, нет ли конфликтов с плагинами безопасности, которые блокируют wp_schedule_event.
  • Удаляются и нужные заказы: убедитесь, что в фильтре даты правильно указан интервал; используйте var_dump() для отладки выборки заказов.
  • Заказы остаются в корзине навсегда: проверьте наличие константы EMPTY_TRASH_DAYS и убедитесь, что WP-Cron работает.
  • Проблемы с производительностью при удалении: разбейте удаление на батчи, например, по 50 заказов за раз, чтобы не перегружать сервер.

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

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

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

МетодПлюсыМинусыПример
WP-Cron + API WooCommerceБезопасно, корректно очищает данныеЗависит от WP-Cron, может быть медленнееКод выше в статье
Прямой SQL-запросОчень быстроРиск повреждения данных, оставление мета данных
DELETE FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-completed' AND post_date < NOW() - INTERVAL 90 DAY;
Плагины очистки базыУдобно для непрофессионаловМогут удалять лишнее, нагрузка на сайтWP-Optimize, Advanced Database Cleaner
WooCommerce: как автоматически удалять неоплаченные заказы через cron и код
26.05.2026
Добавление полей в профиль пользователя WordPress: подробное руководство
04.12.2025
Как использовать хуки в WordPress для автоматизации задач
07.12.2025
Автоматическое удаление неоплаченных заказов в WooCommerce
13.05.2026
Как отключить или полностью удалить редактор Gutenberg в WordPress
13.01.2026