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

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

В стандартной установке WooCommerce неоплаченные заказы (например, со статусом pending или failed) накапливаются в базе данных без ограничения по времени. Это может приводить к росту объёма базы, снижению производительности и запутыванию в отчетах. Особенно актуально для магазинов с высоким трафиком и большим количеством брошенных корзин.

Шаги для автоматического удаления неоплаченных заказов

1. Определяем статус и период удаления

Для начала нужно определиться, какие заказы считать «неоплаченными» и сколько времени они могут храниться. Обычно это статусы pending и failed, а срок — 24 часа или 48 часов.

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

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

function wpid_delete_unpaid_orders() {
    $statuses = array('pending', 'failed');
    $date_threshold = (new DateTime())->modify('-24 hours')->format('Y-m-d H:i:s');

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // принудительно удаляет заказ
        }
    }
}

3. Запускаем функцию по расписанию через WP-Cron

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

if (!wp_next_scheduled('wpid_hourly_delete_unpaid_orders')) {
    wp_schedule_event(time(), 'hourly', 'wpid_hourly_delete_unpaid_orders');
}
add_action('wpid_hourly_delete_unpaid_orders', 'wpid_delete_unpaid_orders');

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

  • Закажите тестовый товар и не оплачивайте его.
  • Убедитесь, что заказ создается со статусом pending или failed.
  • Подождите 24 часа или измените значение в коде на более короткий срок для теста (например, -1 hour).
  • Проверьте через админку WooCommerce, что заказ удалился.
  • Проверьте таблицу wp_posts на наличие удаленного заказа (запрос SQL).

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

  • Заказы не удаляются: убедитесь, что WP-Cron работает на вашем сервере. Для проверки используйте плагин WP Crontrol.
  • Удаляются не те заказы: проверьте, что статусы в массиве $statuses правильно заданы, и что дата сравнивается с полем post_date.
  • Ошибка с правами: функция wp_delete_post требует прав администратора, убедитесь, что код запускается от имени пользователя с нужными правами или в фоне.
  • Повышенная нагрузка при большом количестве заказов: если заказов много, добавьте пагинацию в WP_Query и удаляйте партии по 50-100 штук за вызов.

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

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

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

МетодПлюсыМинусыПример
WP-Cron + кастомный код Гибкость, можно настроить по времени и статусам Зависит от работы WP-Cron, может не сработать на слабых хостингах Код из статьи
Плагины для очистки заказов (например, WooCommerce Order Cleaner) Простота установки и настройки Меньше контроля, могут удалять не те заказы Плагин WooCommerce Order Cleaner
WP-CLI скрипты Высокая производительность при больших объемах Требуется доступ к терминалу сервера wp post delete $(wp post list --post_type=shop_order --post_status=pending --date_query='before=24 hours ago' --format=ids)
Как избежать конфликтов между плагинами в WordPress
22.02.2026
Автоматическое сохранение контента через AJAX в редакторе Gutenberg WordPress
29.01.2026
Автоматическое удаление спам комментариев в WordPress
21.01.2026
Использование хука pre_get_posts для фильтрации постов в WordPress
18.01.2026
Как удалить метаданные из постов WordPress для оптимизации и безопасности
15.11.2025