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

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

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

Чтобы проверить объем неактивных заказов, выполните SQL-запрос в базе данных:

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

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

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

1. Создание функции очистки заказов

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

function wpfreecourses_delete_old_inactive_orders() {
    global $wpdb;
    // Удаляем заказы со статусом pending или failed старше 7 дней
    $days_old = 7;
    $statuses = [ 'wc-pending', 'wc-failed' ];

    $placeholders = implode(',', array_fill(0, count($statuses), '%s'));

    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($placeholders) AND post_date < NOW() - INTERVAL %d DAY",
        ...$statuses,
        $days_old
    );

    $order_ids = $wpdb->get_col($query);

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

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

2. Планирование задачи с помощью WP-Cron

Чтобы запускать очистку автоматически, зарегистрируйте cron-задачу:

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

add_action('wpfreecourses_order_cleanup_hook', 'wpfreecourses_delete_old_inactive_orders');

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

Для контроля работы функции:

  • Перед запуском проверьте количество заказов со статусами wc-pending и wc-failed старше 7 дней.
  • Запустите функцию вручную в админке через временный вызов или воспользуйтесь плагином для ручного запуска cron-задач.
  • После запуска повторно выполните SQL-запрос, количество заказов должно уменьшиться.

Также рекомендуем включить логирование, например, с помощью error_log внутри функции:

error_log('Удалён заказ ID: ' . $order_id);

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

  • Не удаляются заказы: проверьте, что в базе корректно используются префиксы таблиц $wpdb->posts, и что статус заказа точно совпадает с wc-pending или wc-failed.
  • Функция не запускается по cron: убедитесь, что WordPress cron включён (DISABLE_WP_CRON не установлен в true) и что на сайте есть посещения для срабатывания cron.
  • Удаление не происходит полностью: убедитесь, что вызов wp_delete_post($order_id, true) использован с параметром true для полной очистки, иначе заказ попадёт в корзину.

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

  • Не удаляйте заказы с другими статусами, чтобы не потерять важные данные.
  • Период хранения можно настроить, например, увеличить с 7 до 14 дней, чтобы дать пользователям время завершить оплату.
  • Для сайтов с большой нагрузкой лучше использовать системные cron задачи вместо WP-Cron, чтобы избежать задержек.
  • Перед массовым удалением сделайте резервную копию базы данных.

Таблица сравнения способов автоматического удаления заказов

МетодОписаниеПлюсыМинусы
Пользовательский код (описанный выше)Самостоятельная функция с WP-CronПолный контроль, нет дополнительных плагиновТребует навыков программирования, зависит от WP-Cron
Плагин для очистки заказовГотовое решение из репозитория или магазинаПростота настройкиМожет быть тяжеловесным, не всегда гибко
Системный cron + WP-CLIЗапуск скриптов через системный планировщикБолее надежно и быстроТребует доступа к серверу и знаний CLI
Автоматическое изменение цены товара в WooCommerce при заданных условиях
06.05.2026
WooCommerce: автоматическое удаление неактивных заказов
29.05.2026
Как создать динамическую форму в WordPress на PHP и AJAX
13.11.2025
Как создать собственный тип записи WordPress: пошаговое руководство
25.11.2025
Как добавить AJAX в WordPress без jQuery: практическое руководство
09.11.2025