Автоматическое удаление заказов WooCommerce со статусом «неоплачено» по срокам

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

В WooCommerce заказы со статусом «неоплачено» могут накапливаться, особенно если на сайте много посетителей, которые не завершают оплату. Это создает нагрузку на базу данных и затрудняет управление заказами. В стандартном функционале WooCommerce нет автоматического механизма удаления таких заказов по истечении определенного времени. Поэтому необходимо реализовать автоматическое очищение базы от устаревших неоплаченных заказов.

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

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

Первым делом напишем функцию, которая будет искать и удалять заказы со статусом pending или failed, созданные старше указанного количества дней.

function wpclass_delete_old_unpaid_orders() {
    $days = 7; // Удалять заказы старше 7 дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление заказа
        }
    }
}

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

Для регулярного удаления застарелых заказов добавим задачу в планировщик WordPress. В данном примере — ежедневный запуск.

add_action('wpclass_daily_order_cleanup', 'wpclass_delete_old_unpaid_orders');

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

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

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

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

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

  • Создайте заказ со статусом «ожидает оплаты» (pending) и датой создания более 7 дней назад (можно вручную в базе или через изменение даты в заказе).
  • Запустите вручную функцию wpclass_delete_old_unpaid_orders() через консоль WP-CLI или добавьте вызов временно в шаблон.
  • Проверьте, что заказ удалился из админки WooCommerce и из базы данных (таблица wp_posts).
  • Убедитесь, что cron-задача запланирована — используйте плагин WP Crontrol или команду WP-CLI wp cron event list.

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

  • Заказы не удаляются: Проверьте, что у вас есть права для удаления постов, а функция wp_delete_post вызывается с флагом удаления навсегда (true).
  • Функция не вызывается по расписанию: Убедитесь, что WP-Cron работает (трафик на сайт есть), или настройте системный cron для вызова wp-cron.php.
  • Удаляются не те заказы: Проверьте фильтр по статусам и дате. Статусы должны точно совпадать с теми, которые вы хотите удалять (pending, failed и т.п.).
  • Удаление влияет на другие связанные данные: Если есть кастомные метаданные или интеграции, убедитесь, что они корректно удаляются вместе с заказом.

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

  • Не удаляйте заказы с важными статусами (например, processing, completed), чтобы не потерять данные по оплатам.
  • Для больших магазинов используйте лимит на количество удаляемых заказов за один запуск, чтобы не создавать нагрузку на сервер.
  • Логируйте удаление заказов в отдельный файл для последующего аудита.
  • Проверяйте совместимость с плагинами кеширования и механизмами бэкапов, чтобы избежать конфликтов.

Таблица сравнения вариантов удаления заказов

МетодПлюсыМинусы
Ручное удаление через админкуПросто, нет кодаНеэффективно при большом количестве заказов
Плагин для очистки заказовУдобный интерфейс, настройкиДоп. нагрузка, может конфликтовать
Кастомный код с WP-CronКонтроль, минимально, гибкоТребует навыков, настройка cron
Как отключить и избежать загрузку неиспользуемых шаблонов WordPress
02.02.2026
Как изменить URL структуру таксономии в WordPress без потери SEO
17.02.2026
Как использовать WP GraphQL для эффективного доступа к данным WordPress
21.04.2026
Как создать собственный REST API endpoint в WordPress
22.11.2025
Как отключить AJAX подгрузку корзины WooCommerce для улучшения производительности
17.05.2026