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

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

В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или on-hold, которые не подтверждаются и не оплачиваются. Это приводит к увеличению нагрузки на базу данных, затрудняет обработку актуальных заказов и может негативно сказаться на аналитике.

Для диагностики проблемы проверьте, сколько неподтверждённых заказов хранится в базе. Это можно сделать через админку WooCommerce в разделе Заказы с фильтром по статусам pending и on-hold. Также можно получить количество через SQL-запрос:

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

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

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

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

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

function wpma_delete_old_unconfirmed_orders() {
    global $wpdb;
    
    $days = 7; // Удалять заказы старше 7 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    // Получаем ID неподтверждённых заказов старше порога
    $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)) {
        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // Удалить навсегда
        }
    }
}

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

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

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

add_action('wpma_daily_delete_unconfirmed_orders', 'wpma_delete_old_unconfirmed_orders');

3. Удаление расписания при деактивации темы или плагина

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

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

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

  • Создайте тестовый заказ со статусом pending с датой более 7 дней назад (можно через phpMyAdmin или WP CLI).
  • Запустите крон вручную через WP CLI: wp cron event run wpma_daily_delete_unconfirmed_orders или дождитесь автоматического запуска.
  • Проверьте, что заказ был удалён, например, через админку или SQL-запрос.

Также можно добавить логирование удаления для отладки:

function wpma_delete_old_unconfirmed_orders() {
    global $wpdb;
    $days = 7;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $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)) {
        foreach ($order_ids as $order_id) {
            if (wp_delete_post($order_id, true)) {
                error_log("[WPMA] Deleted order ID: $order_id");
            }
        }
    }
}

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

  • Крон не срабатывает: На некоторых хостингах WP-Cron не запускается автоматически. Проверьте, активен ли DISABLE_WP_CRON в wp-config.php. Для надёжности настройте системный cron на вызов wp-cron.php.
  • Удаляются нужные заказы: Проверьте условие по дате и статусу, чтобы не удалять свежие или подтверждённые заказы. Можно увеличить временной порог.
  • Ошибка прав доступа: Убедитесь, что функция вызывается в контексте WordPress с доступом к базе данных и функциям.
  • Потеря данных: Перед автоматическим удалением сделайте резервную копию базы данных.

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

  • Резервное копирование: Автоматическое удаление заказов — рискованная операция. Перед внедрением настройте регулярное резервное копирование.
  • Оптимизация запросов: Запросы к базе должны быть индексированы по post_type и post_status. Стандартные индексы WordPress обычно достаточны.
  • Логирование и уведомления: Добавьте логирование или уведомления по email при удалении большого количества заказов для контроля.
  • Тестирование: Обязательно тестируйте на резервной копии сайта, чтобы избежать потери данных в живом магазине.

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

МетодОписаниеПлюсыМинусы
Ручное удаление через админкуУдаление заказов вручную в WooCommerceПростой способ, без кодаТрудоёмко, не подходит для большого количества
SQL-запросы напрямуюУдаление заказов через SQLБыстро, контролируемоРиск повреждения данных, требует знаний SQL
Автоматизация через WP-Cron и PHPАвтоматический скрипт на PHPАвтоматизация, гибкость, интеграция с WordPress APIНужно правильно настроить cron и протестировать
Плагины очистки базыИспользование готовых плагинов типа Clearfy ProУдобно, готовый интерфейсМожет быть платным, избыточно для одной задачи
WooCommerce: как решить проблему с повторной оплатой одного заказа
30.04.2026
Как использовать WP-Cron для автоматизации задач в WordPress
26.04.2026
Как создать и использовать внешние REST API в WordPress
26.11.2025
WooCommerce: как исправить ошибку дублирования SKU товаров
28.06.2026
Как добавить настройку очистки кеша в админке WordPress
07.01.2026