Автоматическое удаление забытых заказов WooCommerce без плагинов

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

В WooCommerce «забытые заказы» — это заказы со статусом pending или failed, которые не были завершены покупателем. Они не только загромождают базу данных, но и могут влиять на аналитические отчёты и замедлять работу сайта при большом количестве таких записей.

Диагностика: Вы можете проверить количество таких заказов с помощью SQL-запроса к базе данных:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');

Если число превышает несколько сотен — имеет смысл настроить автоматическое удаление.

Пошаговое решение: настройка автоматического удаления забытых заказов через WP-Cron

1. Создание функции для удаления старых заказов

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

function wptest_delete_old_abandoned_orders() {
    global $wpdb;
    $days = 7; // Удалять заказы старше 7 дней
    $statuses = ['wc-pending', 'wc-failed'];

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ($statuses as $status) {
        $orders = wc_get_orders([
            'status' => $status,
            'date_created' => '<' . $date_threshold,
            'limit' => -1,
            'return' => 'ids',
        ]);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // Удаление без возможности восстановления
            }
        }
    }
}

2. Регистрация события WP-Cron для периодического запуска

Добавьте планировщик, который будет запускать функцию раз в сутки:

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

add_action('wptest_abandoned_order_cleanup_hook', 'wptest_delete_old_abandoned_orders');

3. Удаление задачи при деактивации

Чтобы избежать «мусора» в планировщике, удалите cron-задачу при деактивации плагина или смене темы:

function wptest_clear_abandoned_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wptest_abandoned_order_cleanup_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wptest_abandoned_order_cleanup_hook');
    }
}
register_deactivation_hook(__FILE__, 'wptest_clear_abandoned_order_cleanup_schedule');

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

  • Через несколько дней (или для теста вручную вызовите wptest_delete_old_abandoned_orders()) проверьте базу данных SQL-запросом выше. Количество заказов со статусами wc-pending и wc-failed должно уменьшиться.
  • В панели WooCommerce убедитесь, что старые незавершённые заказы отсутствуют.
  • Для отладки добавьте логирование в функцию удаления через error_log() или используйте плагин Debug Bar.

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

  • Заказы не удаляются: Проверьте, что статус заказа указан с префиксом wc- (например, wc-pending), а не просто pending.
  • WP-Cron не срабатывает: Убедитесь, что на сайте есть трафик — WP-Cron запускается при посещении сайта. Для теста используйте плагин WP Crontrol для ручного запуска задачи.
  • Ошибка в SQL или wp_delete_post: Проверьте наличие прав пользователя, под которым работает сайт, и синтаксис кода.

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

  • Безопасное удаление: Используйте wp_delete_post($order_id, true), чтобы полностью удалить заказ из базы без помещения в корзину удалённых записей, что уменьшит нагрузку.
  • Ограничение числа удаляемых заказов: В больших базах данных при большом количестве забытых заказов добавьте пагинацию удаления, чтобы не перегружать сервер:
function wptest_delete_old_abandoned_orders_batch() {
    $days = 7;
    $statuses = ['wc-pending', 'wc-failed'];
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $batch_limit = 20; // Удалять по 20 заказов за запуск

    foreach ($statuses as $status) {
        $orders = wc_get_orders([
            'status' => $status,
            'date_created' => '<' . $date_threshold,
            'limit' => $batch_limit,
            'return' => 'ids',
        ]);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true);
            }
        }
    }
}
  • Регулярно чистите базу: Настройте резервное копирование перед внедрением автоматического удаления.
  • Мониторинг: Используйте плагины типа Clearfy Pro для контроля дублей и оптимизации базы данных.

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

МетодПлюсыМинусыПример использования
Ручное удаление через админкуПростота, без кодаТрудоёмко при большом количествеWooCommerce > Заказы > фильтр > удаление
Плагины очистки (например Clearfy Pro)Автоматизация, дополнительные функции оптимизацииПотенциальная нагрузка, необходимость обновленийClearfy Pro
Кастомный код с WP-Cron (этот метод)Контроль, без сторонних плагинов, гибкостьТребует навыков, нужно тестироватьКод из статьи
Как избежать проблем с загрузкой больших файлов в WordPress
14.06.2026
WordPress: как добавить собственные метаполя в посты
19.11.2025
Как автоматизировать удаление старого контента в WordPress
28.01.2026
Как удалить старые вариации товара в WooCommerce
19.04.2026
Как использовать pre_get_posts для автоматизации выборок записей в WordPress
23.06.2026