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

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

В крупных WooCommerce-магазинах накопление неоплаченных заказов способно привести к большому количеству «мусора» в базе данных, замедлению загрузки страниц заказов и путанице в аналитике. Неоплаченные заказы, оставшиеся в статусе "pending" или "failed" долгое время, не имеют коммерческой ценности и занимают ресурсы.

Первый шаг — определить, есть ли в базе такие заказы и как долго они остаются неоплаченными. Для этого используйте запрос к базе данных (через phpMyAdmin или WP CLI):

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

Если вы видите много заказов с датой старше 30 дней, имеет смысл автоматизировать их удаление.

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

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

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

function wprus_delete_old_unpaid_orders() {
    $days = 30; // количество дней для хранения неоплаченных заказов
    $statuses = array('wc-pending', 'wc-failed');
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
    );

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => $statuses,
        'date_query' => array($date_query),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // перемещаем в корзину
            // или wp_delete_post($order_id, true); для полного удаления без корзины
        }
    }
}

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

Добавьте в functions.php следующий код для регистрации ежедневного события:

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

add_action('wprus_daily_delete_unpaid_orders', 'wprus_delete_old_unpaid_orders');

Этот код запустит очистку один раз в день. Если хотите чаще — замените 'daily' на 'hourly' (требуется регистрация кастомного интервала).

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

  • Перейдите в админку WooCommerce → Заказы и отфильтруйте по статусам «Ожидает оплаты» и «Неудачный». Убедитесь, что заказы старше 30 дней исчезли.
  • Проверьте таблицу wp_posts, чтобы подтвердить отсутствие старых заказов с нужными статусами.
  • Включите логирование, временно добавив в функцию запись в файл, например:
error_log('Deleted order ID: ' . $order_id);

Просмотрите debug.log для подтверждения работы скрипта.

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

  • Заказы не удаляются: Проверьте, что событие WP-Cron действительно запускается. На локальной среде или при малом трафике cron может не срабатывать. Альтернативно, настройте системный cron на сервере.
  • Удаляются не те заказы: Убедитесь, что в массиве $statuses указаны правильные статусы WooCommerce с префиксом wc-. Например, wc-pending, а не просто pending.
  • Скрипт вызывает нагрузку: Если заказов тысячи, разбейте удаление на порции (например, 100 заказов за запуск), чтобы избежать таймаутов.

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

  • Используйте wp_trash_post() вместо wp_delete_post(), чтобы иметь возможность восстановить ошибочно удалённый заказ.
  • Ограничьте права доступа к этой функции — она должна запускаться только через WP-Cron или админом.
  • Регулярно очищайте корзину заказов (trash) с помощью штатного механизма WordPress или отдельного скрипта.
  • Для повышения производительности используйте WP-CLI команды при массовом удалении в больших магазинах.

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

МетодПлюсыМинусы
Ручное удаление вручнуюПростота, контрольЗатратно по времени, риск пропуска
Автоматизация через WP-Cron и phpПолная автоматизация, гибкостьЗависимость от cron, требует кодирования
Плагины очистки базыУдобство, дополнительные функцииНагрузка на сайт, возможные конфликты
Как автоматизировать удаление старых ревизий в WordPress
09.01.2026
Как использовать внутренние переадресации в WordPress для оптимизации SEO
15.12.2025
Как добавить защиту от Brute Force атак в WordPress без плагинов
18.02.2026
WooCommerce: как автоматически отключить отзывы для определённых ролей пользователей
10.06.2026
Как создать автоматический импорт продуктов в WooCommerce из CSV с помощью кода и плагинов
19.03.2026
×

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

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

пишет статьи

готовит SEO

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

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