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

Почему важно удалять неактивные заказы в WooCommerce

Неактивные заказы (например, ожидающие оплаты или заброшенные корзины) могут накапливаться и загромождать базу данных, замедляя работу магазина и усложняя отчеты. Регулярное удаление таких заказов помогает поддерживать производительность и чистоту данных.

Что считается неактивным заказом

В WooCommerce к неактивным можно отнести заказы со статусами:

  • pending (ожидает оплаты);
  • failed (неудачная оплата);
  • cancelled (отменён);
  • on-hold (на удержании) — если не изменяется долго.

Обычно удаляют заказы, которые не менялись в течение определённого времени (от 7 до 30 дней).

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

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

  • Подключитесь к базе данных MySQL через phpMyAdmin или консоль.
  • Выполните запрос для подсчёта заказов со статусом pending старше 14 дней:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < NOW() - INTERVAL 14 DAY;

Если число большое (сотни и более), удаление актуально.

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

Добавим в файл functions.php вашей темы или в кастомный плагин следующий код для удаления заказов со статусами pending, failed и cancelled, которые созданы более 14 дней назад.

function wpkit_delete_old_inactive_orders() {
    global $wpdb;
    $statuses = array('wc-pending', 'wc-failed', 'wc-cancelled');
    $days = 14;

    foreach ($statuses as $status) {
        $orders = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < NOW() - INTERVAL %d DAY",
            $status,
            $days
        ));

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

// Запускаем при событии 'woocommerce_cleanup_sessions' — оно уже настроено на ежедневный крон
add_action('woocommerce_cleanup_sessions', 'wpkit_delete_old_inactive_orders');

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

Создание отдельного WP-Cron для удаления заказов

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

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

add_action('wpkit_delete_old_orders_hook', 'wpkit_delete_old_inactive_orders');

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

  • Создайте тестовый заказ с нужным статусом и датой старше 14 дней (можно вручную изменить дату в базе).
  • Запустите крон вручную через плагин WP Crontrol или дождитесь автоматического запуска.
  • Проверьте, что заказ удалён из раздела «Заказы» WooCommerce.
  • Выполните SQL-запрос из раздела диагностики, чтобы убедиться, что количество старых заказов уменьшилось.

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

  • Заказы не удаляются: проверьте, срабатывает ли крон. Используйте плагин WP Crontrol для просмотра и запуска задач вручную.
  • Удаляются не те заказы: проверьте правильность статусов и даты в SQL-запросе и фильтре.
  • Удаление вызывает ошибки или зависания: если заказов очень много, используйте пакетное удаление с ограничением количества за раз (например, 50 заказов в цикле).

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

  • Всегда делайте резервную копию базы данных перед внедрением автоматического удаления.
  • Для крупных магазинов используйте пакетное удаление и логирование действий для отладки.
  • Не удаляйте заказы с успешной оплатой и выполнением.
  • Для дополнительной безопасности можно добавить проверку текущего пользователя или IP при ручном запуске.
  • Периодически очищайте также связанные метаданные и пользовательские данные, чтобы избежать мусора в базе.

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

МетодОписаниеПлюсыМинусы
Ручное удаление в админкеУдаление заказов через интерфейс WooCommerceПростота, контрольТрудозатратно, риск пропуска
Плагин для очисткиИспользование сторонних плагинов типа WP Rocket или Clearfy ProАвтоматизация, настройкиЗависимость от стороннего кода, возможны конфликты
Кастомный код с WP-CronАвтоматическое удаление через функции и кронГибкость, полный контрольТребует навыков, возможны ошибки без тестов
WooCommerce: как заблокировать оплату при наличии товаров с определёнными атрибутами в корзине
22.05.2026
WooCommerce: как заблокировать оплату при наличии товаров с определёнными атрибутами в корзине
23.07.2026
Как изменить URL авторского текста в WordPress
22.02.2026
Как создать динамический виджет в WordPress с примерами кода
06.01.2026
WooCommerce: как автоматически удалять неактивные заказы
13.07.2026