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

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

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

Чтобы проверить текущий статус заказов, зайдите в админку WooCommerce → Заказы и выберите фильтр по статусу Ожидает оплаты или В ожидании. Обратите внимание на количество таких заказов и дату их создания.

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

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

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин. Он удалит все заказы со статусом pending или failed, созданные более 3 дней назад.

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

    $args = array(
        'limit' => -1,
        'status' => array('pending', 'failed'),
        'date_created' => '<' . $date,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // можно заменить на wp_delete_post($order_id, true) для полного удаления
    }
}

// Запускаем функцию ежедневно через WP-Cron
add_action('wprus_daily_delete_old_unpaid_orders', 'wprus_delete_old_unpaid_orders');

// Регистрируем событие при активации темы или плагина
if (! wp_next_scheduled('wprus_daily_delete_old_unpaid_orders')) {
    wp_schedule_event(time(), 'daily', 'wprus_daily_delete_old_unpaid_orders');
}

2. Настройка времени удаления и статусов заказов

В коде вы можете изменить переменную $days для установки другого порога по времени. Например, 7 для недели или 1 для суток. Также можно добавить или убрать статусы заказов в массиве 'status' => array().

3. Исключение определенных заказов из удаления

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

foreach ($orders as $order_id) {
    $order = wc_get_order($order_id);
    // Пример исключения заказов с товаром ID 123
    $items = $order->get_items();
    $exclude = false;
    foreach ($items as $item) {
        if ($item->get_product_id() == 123) {
            $exclude = true;
            break;
        }
    }
    if (! $exclude) {
        wp_trash_post($order_id);
    }
}

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

После добавления кода:

  • Запустите вручную функцию через do_action('wprus_daily_delete_old_unpaid_orders'); в консоли WP или временно добавьте вызов в functions.php, чтобы проверить удаление.
  • Проверьте раздел Заказы в WooCommerce: старые неоплаченные заказы должны быть перемещены в корзину (или удалены).
  • Проверьте таблицу wp_posts в базе данных — заказы с типом shop_order и статусом trash или удаленные записи должны отсутствовать, если используется полное удаление.

Через сутки или при следующем запуске WP-Cron функция будет запускаться автоматически.

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

  • Крон не запускается: Проверьте, что на сайте активен WP-Cron. Для теста вызовите do_action('wprus_daily_delete_old_unpaid_orders'); вручную.
  • Заказы не удаляются: Убедитесь, что статусы заказов указаны правильно (pending, failed и т.д.). Проверьте формат даты $date.
  • Удаляются нужные заказы: Добавьте проверку исключений (например, по товарам или меткам) перед удалением.
  • Ошибка доступа к функциям WooCommerce: Убедитесь, что WooCommerce активен и код запускается после его загрузки (например, в хук woocommerce_init).

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

  • Используйте пакетное удаление: Если заказов много, делайте выборку и удаление партиями, чтобы избежать тайм-аутов.
  • Резервные копии базы: Перед массовым удалением делайте резервную копию базы данных.
  • Логирование: Добавьте логирование удаленных заказов в отдельный файл для аудита.
  • Ручной запуск: Реализуйте кнопку в админке для запуска очистки вручную с подтверждением.
  • Проверяйте WP-Cron: Для сайтов с низким трафиком используйте системный cron вместо WP-Cron для надежности.

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

МетодПреимуществаНедостатки
Код с WP-Cron (как в статье)Полный контроль, гибкость, бесплатноНужно писать и тестировать; завязка на WP-Cron
Плагины очистки заказов (например, WooCommerce Order Cleaner)Простота настройки, готовые функциональностиМожет быть избыточным; зависимость от стороннего кода
Ручное удаление через админкуПростота, не требует кодаТрудозатратно, ошибочно можно удалить нужные заказы
Как использовать внутренние переадресации в WordPress для оптимизации SEO
15.12.2025
WooCommerce: как автоматически отключить отзывы для определённых ролей пользователей
10.06.2026
Как автоматизировать создание и удаление чисток в WordPress с помощью плагинов и кода
01.01.2026
Как динамически изменить заголовок страницы в WordPress: практические методы и примеры
24.03.2026
Как сделать динамические скриптовые блоки в WordPress с помощью AJAX
17.01.2026
×

AI-плагин от WPShop.ru

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

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше