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

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

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

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

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

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

function delete_unpaid_orders_after_time() {
    // Время в часах, после которого заказы считаются устаревшими
    $hours = 24;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $hours . ' hours'));

    $args = array(
        'status' => 'pending', // статус неоплаченных заказов
        'date_created' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

2. Регистрируем WP-Cron задачу

Добавим хук для запуска функции ежедневно. Для этого регистрируем событие, если оно еще не создано:

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

add_action('daily_delete_unpaid_orders', 'delete_unpaid_orders_after_time');

3. Отключение задачи при деактивации темы или плагина

Чтобы избежать «мусора» в WP-Cron, удаляем событие при деактивации плагина или смене темы:

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

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

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

  • Создайте заказ со статусом pending и датой создания старше 24 часов (можно вручную изменить дату в базе через phpMyAdmin для теста).
  • Запустите WP-Cron вручную через плагин WP Crontrol или дождитесь ежедневного запуска.
  • Проверьте, что заказ удалён из базы (в админке WooCommerce или через SQL-запрос).
  • Просмотрите логи debug.log (если включен WP_DEBUG) на наличие ошибок.

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

  • Удаление не происходит: Убедитесь, что WP-Cron работает. По умолчанию он запускается при посещении сайта. Если мало трафика, настройте реальный cron на сервере.
  • Функция не находит заказы: Проверьте правильность параметров wc_get_orders и статус заказов. Статус pending — неоплаченный заказ. Если у вас другой статус, измените параметр.
  • Заказы удаляются не полностью: Используйте wp_delete_post($order_id, true) с вторым параметром true для полного удаления без помещения в корзину.
  • Ошибки при деактивации: Проверьте, что register_deactivation_hook используется в плагине. Для темы используйте switch_theme хук.

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

  • Всегда делайте резервную копию базы данных перед массовым удалением заказов.
  • Не ставьте слишком маленький интервал удаления — это может привести к удалению заказов, которые еще в процессе оплаты.
  • Оптимизируйте запросы: лимитируйте количество удаляемых заказов за один запуск, если база большая.
  • Для мониторинга добавьте логирование ID удалённых заказов в отдельный файл или в системный лог.
  • Если хотите более гибкую очистку, рассмотрите плагины типа Clearfy Pro с расширенными функциями оптимизации WooCommerce.

Сравнение вариантов реализации автоматического удаления заказов

МетодПлюсыМинусыПример
WP-Cron + код в functions.phpГибко, бесплатно, полностью под ваш контрольЗависит от посещаемости сайта, требует технических навыковОписание выше
Плагин для очистки заказов (например, WooCommerce Order Cleaner)Простота установки, автоматизация без кодаМеньшая гибкость, возможны лишние функцииWooCommerce Order Cleaner
Реальный системный cron + кастомный скриптНадежно, не зависит от посещаемостиТребует доступа к серверу и навыков настройки cronphp-скрипт + cron на сервере
Как избежать конфликтов между плагинами в WordPress: практические решения
25.12.2025
Массовое изменение и удаление атрибутов alt у изображений в WordPress
14.02.2026
Как удалить метаданные из изображений в WordPress для ускорения сайта
14.12.2025
Оптимизация комментариев в WordPress с помощью WP Remark
04.04.2026
Автоматическое переключение языка в WordPress по геолокации
07.01.2026