WooCommerce: автоматическое удаление заказов по отсутствию платежей и срокам

В чем проблема с неактивными заказами в WooCommerce

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

Задача — автоматизировать удаление неоплаченных или просроченных заказов через заданный срок после их создания или после изменения статуса.

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

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

SELECT post_id, meta_value AS status FROM wp_postmeta WHERE meta_key = '_order_status';

Но удобнее получить список с датами создания и статусами:

SELECT p.ID, p.post_date, pm.meta_value AS status FROM wp_posts p JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE p.post_type = 'shop_order' AND pm.meta_key = '_order_status' ORDER BY p.post_date DESC LIMIT 20;

Это позволит понять, сколько заказов в статусах pending, failed, cancelled и других, и определить критерии для очистки.

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

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

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

function wpbe_delete_old_unpaid_orders() {
    $days_to_keep = 7; // Кол-во дней, после которых заказы удаляются
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    $args = [
        'status' => ['pending', 'failed'], // Статусы для удаления
        'limit' => -1,
        'date_created' => '<' . $date_threshold,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

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

2. Запускаем задачу по расписанию с помощью WP-Cron

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

if (!wp_next_scheduled('wpbe_delete_old_unpaid_orders_cron')) {
    wp_schedule_event(time(), 'daily', 'wpbe_delete_old_unpaid_orders_cron');
}

add_action('wpbe_delete_old_unpaid_orders_cron', 'wpbe_delete_old_unpaid_orders');

3. Проверка и отладка

Рекомендуется сначала протестировать функцию вручную:

add_action('init', function() {
    if (isset($_GET['debug_delete_orders'])) {
        wpbe_delete_old_unpaid_orders();
        echo 'Old unpaid orders deleted';
        exit;
    }
});

Откройте сайт с параметром ?debug_delete_orders=1 и проверьте, что заказы удалились. После теста удалите этот код.

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

  • В админке WooCommerce проверьте наличие заказов со статусом pending и failed старше 7 дней.
  • Через 24 часа повторите проверку — старые заказы должны исчезнуть.
  • Проверьте логи сервера на ошибки связанных с WP-Cron, если заказы не удаляются.

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

  • WP-Cron не срабатывает: Проверьте, что на сайте есть посещения (WP-Cron запускается при загрузке страницы). Для теста вызовите функцию вручную.
  • Заказы не удаляются: Убедитесь, что статусы указаны правильно. Используйте wc_get_order_statuses() для проверки.
  • Удаление без предварительного резервного копирования: Никогда не удаляйте заказы без бэкапа базы данных.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Не ставьте слишком короткий срок хранения, чтобы не потерять данные по клиентам.
  • Для больших магазинов с тысячами заказов используйте постраничную обработку, чтобы не нагружать сервер.
  • Для контроля логируйте ID удаляемых заказов в отдельный файл или таблицу.

Сравнение вариантов удаления заказов

МетодПлюсыМинусы
Плагин (например, Advanced Order Cleanup)Простота настройки, UIДополнительная нагрузка, возможные конфликты
Код с WP-Cron и wc_get_orders()Точный контроль, легковесностьНеобходимы навыки разработки, возможны ошибки при некорректном коде
Ручное удаление через базу данныхБыстрое удалениеРиск повредить данные, потеря связей
Автоматическое удаление заказов WooCommerce по статусу: как настроить
18.04.2026
WooCommerce: автоматическое обновление статуса заказа по срокам
12.06.2026
Как добавить пользовательские подсказки (tooltips) в админке WordPress
24.12.2025
Как использовать AJAX для динамической загрузки контента в WordPress
01.02.2026
WooCommerce: как установить ограничения на количество товаров в корзине
30.04.2026