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

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

Незавершённые заказы (статусы "отменён", "ожидает оплаты", "обработка" без оплаты) накапливаются в базе WooCommerce и могут создавать нагрузку на базу, искажать статистику продаж, а также приводить к путанице при управлении заказами.

Чтобы убедиться в наличии таких заказов, выполните следующий SQL-запрос напрямую в базе данных (например, через phpMyAdmin):

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') ORDER BY post_date DESC;

Если количество таких заказов велико (сотни и более), это повод автоматизировать процесс их удаления.

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

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

function wpexpert_delete_old_unpaid_orders() {
    // Количество дней, после которых заказы считаются устаревшими
    $days = 7;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов в статусах wc-pending, wc-failed, wc-cancelled старше $days
    $args = [
        'post_type' => 'shop_order',
        'post_status' => ['wc-pending', 'wc-failed', 'wc-cancelled'],
        'date_query' => [
            [
                'before' => $date,
                'inclusive' => true,
            ],
        ],
        'fields' => 'ids',
        'posts_per_page' => -1,
    ];

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление без перемещения в корзину
        }
    }
}

2. Запланируйте регулярное выполнение функции через WP-Cron

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

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

add_action('wpexpert_daily_order_cleanup', 'wpexpert_delete_old_unpaid_orders');

3. Добавьте возможность ручного запуска из админки (опционально)

add_action('admin_post_wpexpert_manual_order_cleanup', function() {
    if (!current_user_can('manage_woocommerce')) {
        wp_die('Доступ запрещён');
    }
    wpexpert_delete_old_unpaid_orders();
    wp_redirect(admin_url('edit.php?post_type=shop_order&message=1'));
    exit;
});

// Добавим кнопку в список заказов
add_action('restrict_manage_posts', function($post_type) {
    if ($post_type !== 'shop_order') return;
    echo '<a href="' . admin_url('admin-post.php?action=wpexpert_manual_order_cleanup') . '" class="button" style="margin-left:10px;">Удалить старые незавершённые заказы</a>';
});

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

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

  • Зайдите в админку WooCommerce → Заказы и проверьте количество заказов со статусами "Ожидает оплаты" и "Отменён", датированных более 7 дней назад.
  • Запустите ручную очистку через кнопку в списке заказов (если добавлена) и обновите страницу — все старые заказы должны исчезнуть.
  • Для проверки WP-Cron используйте плагин WP Crontrol — убедитесь, что задача wpexpert_daily_order_cleanup запланирована и выполняется.

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

  • Заказы не удаляются: Возможно, WP-Cron не срабатывает из-за отсутствия посещений сайта. Решение — настроить системный cron на вызов wp-cron.php или запускать задачу вручную.
  • Удаляются важные заказы: Проверьте, что в статусах для удаления указаны только нежелательные (wc-pending, wc-failed, wc-cancelled). Не используйте wc-processing или wc-completed.
  • Проблемы с правами доступа: Ручной запуск в админке требует прав администратора с возможностью управлять WooCommerce.
  • Высокая нагрузка при удалении большого количества заказов: Если заказов слишком много, можно разбить удаление на части, используя array_chunk и планировать несколько событий в течение дня.

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

  • Удаляйте только заказы старше определённого периода (минимум 7 дней), чтобы не потерять данные по реальным покупкам.
  • Обязательно используйте полное удаление wp_delete_post($order_id, true), чтобы очистить все метаданные заказа и избежать мусора в базе.
  • Для масштабных магазинов с большим количеством заказов рассмотрите использование сторонних плагинов-оптимизаторов, например Clearfy Pro, который предлагает расширенные возможности очистки и оптимизации WooCommerce.
  • Следите за логами ошибок PHP и WooCommerce, чтобы отловить возможные сбои в процессе удаления.

Сравнение вариантов решения

МетодОписаниеПлюсыМинусы
Ручное удаление через админку WooCommerceУдаление каждого заказа вручнуюПростота, контрольТрудозатратно при большом количестве заказов
Код с WP-Cron (текущий метод)Автоматическое удаление заказов старше N днейАвтоматизация, гибкость настройки, бесплатное решениеЗависит от корректной работы WP-Cron, требует базовых навыков кода
Плагины оптимизации WooCommerceГотовые решения с интерфейсом и дополнительными функциямиУдобство, поддержка, расширенный функционалПлатные, могут влиять на производительность
WooCommerce: как устранить ошибку «Невозможно создать заказ» при оформлении
26.05.2026
Как удалить неиспользуемые CSS и JS в WordPress для ускорения сайта
01.03.2026
Как удалить все незавершённые заказы WooCommerce без плагинов
23.04.2026
WooCommerce: как избежать ошибок при автоматическом удалении незавершённых заказов
19.05.2026
Автоматическое удаление незавершённых заказов в WooCommerce
29.04.2026