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

Проблема: накопление неактивных заказов в WooCommerce

Магазины на WooCommerce часто сталкиваются с проблемой, когда в базе данных накапливаются заказы со статусом «ожидает оплаты» или «обработка», которые не были завершены клиентами. Это приводит к разрастанию таблиц в базе и замедлению работы админки, а также усложняет аналитику.

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

Первым шагом необходимо проверить, сколько заказов с неактивным статусом хранится в базе и как давно они созданы. Для этого можно использовать SQL-запрос:

SELECT COUNT(*) AS count, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') GROUP BY post_status;

Также важно определить возраст заказов, чтобы настроить удаление корректно:

SELECT ID, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' ORDER BY post_date ASC LIMIT 10;

Если заказы старше 30 дней, скорее всего, их можно безопасно удалить.

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

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

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

function wpassist_delete_old_wc_orders() {
    global $wpdb;
    $days = 30; // количество дней для хранения заказов
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    // Получаем ID заказов со статусом 'pending' или 'on-hold', старше указанного срока
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'shop_order' 
         AND post_status IN ('wc-pending', 'wc-on-hold') 
         AND post_date < %s",
         $date_threshold
    ));

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

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // удаляем заказ без возможности восстановления
    }
}

2. Регистрация WP-Cron задания

Для автоматического запуска задачи добавьте следующий код:

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

add_action('wpassist_daily_delete_old_wc_orders', 'wpassist_delete_old_wc_orders');

3. Очистка WP-Cron при деактивации плагина

Если реализуете в плагине, добавьте удаление задания при деактивации:

function wpassist_deactivate_plugin() {
    wp_clear_scheduled_hook('wpassist_daily_delete_old_wc_orders');
}
register_deactivation_hook(__FILE__, 'wpassist_deactivate_plugin');

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

Через админку WooCommerce проверьте количество заказов в статусах «ожидает оплаты» и «обработка». После запуска cron-задачи (можно принудительно вызвать функцию через админ-панель или WP-CLI) заказы старше 30 дней должны исчезнуть.

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

wp eval 'wpassist_delete_old_wc_orders();'

Для проверки запланированных задач:

wp cron event list | grep wpassist_daily_delete_old_wc_orders

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

  • Заказы не удаляются: Проверьте статус заказов, которые пытаетесь удалить. В WooCommerce статусы имеют префикс wc-. Ошибка в названии статуса приведет к тому, что запрос не найдет нужных заказов.
  • Удаляются не те заказы: Убедитесь, что в условии даты правильно указана логика. Например, post_date < $date_threshold удалит только старые заказы.
  • WP-Cron не срабатывает: На некоторых хостингах cron может не работать. Используйте системный cron или плагин WP Crontrol для диагностики и запуска задач вручную.
  • Удаление приводит к ошибкам: Если в магазине есть зависимости, например, сторонние плагины, которые работают с заказами, убедитесь, что они корректно обрабатывают удаление заказов.

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

  • Всегда делайте резервное копирование базы перед массовым удалением заказов.
  • Проверяйте нагрузку на сервер при запуске скрипта — если заказов много, лучше разбить удаление на батчи (например, по 50 заказов за раз).
  • Не удаляйте заказы с другими статусами без понимания последствий.
  • Используйте плагин Clearfy Pro для общей оптимизации базы и удаления лишних данных.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПростота, безопасностьТрудоемко при большом количествеРедкие случаи, единичные заказы
SQL-запросы в базеОчень быстрое удалениеРиск повредить данные, минус в связяхОпытным администраторам при полном бэкапе
WP-Cron с wp_delete_post()Автоматизация, корректное удаление с триггерамиЗависит от работы WP-Cron, нагрузка при большом объемеРегулярное удаление старых заказов
Как удалить и заблокировать спам комментарии в WordPress с помощью WPRemark
10.02.2026
WooCommerce: автоматическое изменение стоимости товаров по расписанию
24.05.2026
Как автоматизировать обновление файлов в WordPress без плагинов
03.02.2026
Как удалить пустые meta-поля в WordPress: эффективные методы и примеры
24.02.2026
Как добавить автоответ на чате WordPress
09.01.2026