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

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

При большом объеме продаж база данных WooCommerce быстро растет, особенно таблицы, связанные с заказами (wp_posts и wp_postmeta). Это замедляет работу сайта и приводит к увеличению времени бэкапов. Удаление старых и неактивных заказов помогает уменьшить нагрузку на базу, повысить производительность и оптимизировать резервное копирование.

Основная задача — настроить автоматическое удаление заказов старше определенного периода (например, 6 месяцев), чтобы не удалять вручную и не использовать сторонние плагины.

Как определить, какие заказы можно безопасно удалить

Прежде чем удалять, нужно понять, что заказы бывают разных статусов:

  • completed — выполненные заказы;
  • processing — в обработке;
  • cancelled, refunded, failed — отменённые или неудачные;
  • on-hold — ожидающие оплаты.

Для удаления обычно выбирают заказы со статусами cancelled, failed и refunded, а также completed старше заданного срока, если бизнес-процессы это позволяют.

Пошаговое решение: автоматизация удаления заказов с помощью WP-Cron

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

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

function wpmart_delete_old_orders() {
    $days = 180; // Период хранения заказов в днях
    $date_query = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-completed', 'wc-cancelled', 'wc-failed', 'wc-refunded'),
        'date_query'     => array(
            array(
                'before' => $date_query,
                'inclusive' => true,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
        'no_found_rows'  => true,
    );

    $query = new WP_Query($args);

    if ( ! empty($query->posts) ) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // Удаляет заказ без перемещения в корзину
        }
    }
}

2. Регистрируем крон-задачу

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

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

add_action('wpmart_cron_delete_old_orders', 'wpmart_delete_old_orders');

Это настройка запускает функцию удаления один раз в сутки.

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

  • Убедитесь, что в базе данных удалились старые заказы с указанными статусами и датами;
  • Проверьте логи для ошибок (можно добавить логирование в функцию удаления, например, через error_log);
  • На сайте зайдите в WooCommerce → Заказы и посмотрите, уменьшилось ли количество старых заказов;
  • Для ручного теста вызовите функцию напрямую через wp cli или временно вызовите в functions.php — но не забудьте удалить вызов после теста.

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

  • Крона не срабатывает: WP-Cron работает при посещении сайта. Для надежной работы настройте системный cron на сервере, вызывающий wp-cron.php каждые 15 минут.
  • Удаляются нужные заказы: проверьте фильтр по статусам и дате, не удаляйте заказы со статусом processing или on-hold.
  • Ошибка памяти: при большом количестве заказов разбейте удаление на партии по 50-100 заказов за раз.
  • Отсутствие резервных копий: всегда делайте бэкап перед внедрением автоматических удалений.

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

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

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

МетодОписаниеПлюсыМинусы
Сторонний плагин Использование готовых решений для очистки заказов Быстро, настраиваемый, поддержка Дополнительная нагрузка, возможные конфликты, лицензии
Код с WP-Cron Автоматизация удаления через функции и крон WordPress Легковесно, без плагинов, полный контроль Требует навыков, зависит от корректности крона
Ручное удаление Удаление через админку или SQL-запросы Просто, без кода Непрактично при большом объеме, риск ошибок
Как удалить или изменить атрибуты srcset в WordPress
16.03.2026
Как удалить автоматическое перенаправление в WordPress
26.01.2026
Как удалить дублирующие записи по пользовательскому полю в WordPress
04.04.2026
Как создать собственный тип постов в WordPress с поддержкой REST API
14.04.2026
Как создать динамический виджет в WordPress с использованием REST API
28.02.2026