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

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

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

Удаление таких заказов вручную неудобно и часто забывается. Автоматизация очистки позволяет поддерживать базу в актуальном состоянии без потери данных по успешным заказам.

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

Проверка количества и возраста незавершённых заказов

Для оценки ситуации выполните SQL-запрос к базе данных через phpMyAdmin или wp-cli:

SELECT post_status, COUNT(*) as count, MIN(post_date) as oldest_order
FROM wp_posts
WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed')
GROUP BY post_status;

Если количество >1000 или самый старый заказ >30 дней, стоит задуматься об автоматической очистке.

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

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

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

function wpex_delete_old_uncompleted_orders() {
    $days = 7; // количество дней, старше которых заказы будут удалены
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    $orders = get_posts($args);

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

2. Запускаем функцию по крону раз в сутки

Добавим событие в планировщик WordPress:

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

add_action('wpex_daily_delete_old_orders', 'wpex_delete_old_uncompleted_orders');

3. Очистка планировщика при деактивации темы или плагина

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

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

Для проверки, что удаление работает корректно:

  • Создайте тестовый заказ с статусом "pending" и датой старше 7 дней (можно вручную изменить дату в базе для теста).
  • Запустите вручную функцию wpex_delete_old_uncompleted_orders() через WP-CLI или временно вызовите в шаблоне.
  • Проверьте, что заказ исчез из базы данных.
  • Отследите cron-события с помощью плагина WP Crontrol — там должно быть событие wpex_daily_delete_old_orders.

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

  • Неправильный статус заказа: используйте корректные статусы WooCommerce — например, wc-pending, wc-failed. Все статусы начинаются с префикса wc-.
  • Удаление успешных заказов: убедитесь, что фильтруете только нужные статусы. Никогда не трогайте wc-completed или wc-processing.
  • Функция не запускается по расписанию: проверьте, активен ли WP Cron и не блокируется ли внешними средствами (например, по настройкам хостинга).
  • Проблемы с правами на удаление: убедитесь, что у пользователя базы данных есть права на удаление записей из таблицы wp_posts.

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

  • Удаляйте заказы только по статусу и возрасту, чтобы не потерять важные данные.
  • Если база большая — ограничьте количество удаляемых заказов за один цикл, чтобы не нагружать сервер:
    'posts_per_page' => 100,
  • Регулярно делайте резервные копии базы данных перед автоматическими операциями.
  • Для улучшения производительности используйте WP CLI для запуска задач вне HTTP-запросов.
  • Если вам нужны расширенные возможности очистки и отчетности — рассмотрите плагин Clearfy Pro, который умеет чистить базу от мусора и оптимизировать WooCommerce.

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

СпособПреимуществаНедостатки
Ручное удаление через админкуПростота, безопасностьТрудоемко, не подходит для больших объёмов
Код с автоматическим cron-запускомАвтоматизация, гибкость настройкиТребует навыков, возможны ошибки без тестирования
Плагины очистки (Clearfy Pro)Удобство, дополнительные функцииПлатно, может быть избыточно для простых задач
Как сделать автоматическое сохранение записи в WordPress через плагин
01.02.2026
Автоматическое отключение и удаление незавершённых заказов в WooCommerce
22.05.2026
Автоматическая регистрация пользователей WordPress с подтверждением по email
24.03.2026
Как отладить проблемы со шорткодами в WordPress
13.04.2026
Удаление оставшихся закрытых HTML тегов в WordPress
21.03.2026