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

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

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

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

Проверьте, сколько неоплаченных заказов содержится в базе. Для этого в админке WooCommerce перейдите в "Заказы", выберите статус "Ожидает оплаты" (pending) или "Обработка" (processing) и посмотрите количество записей. Если их тысячи, стоит настроить автоматическую очистку.

Также можно выполнить SQL-запрос для оценки:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';

Пошаговое решение: удаление заказов старше N дней

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

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

function wpedu_delete_old_unpaid_orders() {
    $days = 30; // количество дней для хранения неоплаченных заказов
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'limit'        => -1,
        'status'       => 'pending', // статус неоплаченного заказа
        'date_created' => '<' . $date_threshold,
        'return'       => 'ids',
    ];

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление
        }
    }
}

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

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

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

add_action('wpedu_daily_order_cleanup', 'wpedu_delete_old_unpaid_orders');

3. Отмена расписания при деактивации

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

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

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

Для проверки правильности работы:

  • Создайте тестовый заказ с статусом "Ожидает оплаты" и датой создания более 30 дней назад (можно изменить дату в базе для теста).
  • Запустите функцию вручную через консоль WP-CLI или добавьте временный вызов wpedu_delete_old_unpaid_orders(); в functions.php.
  • Проверьте, что заказ удалился из базы и не отображается в админке.
  • Убедитесь, что cron-задача запланирована: wp cron event list или плагином WP Crontrol.

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

  • Заказы не удаляются: проверьте, что в аргументах запроса статус указан правильно — WooCommerce использует статус с префиксом wc-, но в wc_get_orders достаточно просто pending.
  • Функция не запускается автоматически: убедитесь, что WP-Cron работает (нужно посещение сайта или настройка системного cron). Используйте плагин WP Crontrol для диагностики.
  • Удаляются не те заказы: проверьте параметр date_created и формат даты. В WooCommerce дата должна быть в формате ISO 8601 или MySQL DATETIME, но wc_get_orders корректно обрабатывает строку.
  • Ошибка прав доступа: код должен выполняться с правами администратора, особенно если вызываете вручную. В планировщике это не требуется.

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

  • Резервное копирование: перед автоматическим удалением старых заказов настройте регулярные резервные копии базы.
  • Логирование: ведите логи удаленных заказов для аудита. Можно добавить запись в лог-файл или в отдельную таблицу.
  • Оптимизация запросов: если заказов очень много, реализуйте удаление пакетами, например, по 50 записей за один запуск, чтобы не перегружать сервер.
  • Настройка интервала: при высокой нагрузке лучше запускать очистку раз в неделю, а не ежедневно.

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

МетодПлюсыМинусы
WP-Cron с пользовательской функциейГибкость, полный контроль, бесплатное решениеЗависит от посещаемости сайта, требует навыков программирования
Плагин автоматической очистки заказовПростота настройки, интерфейсОграниченная кастомизация, возможна нагрузка, платные функции
Системный cron с WP-CLIНадежность, не зависит от посещений сайта, высокая производительностьТребуются права SSH, знания командной строки
Изменение атрибута alt у изображений в WordPress: практические решения и примеры кода
29.11.2025
Как использовать shortcode для отображения продуктов из WPSHOP в WordPress
31.03.2026
WooCommerce: автоматическое удаление старых неоплаченных заказов с подробной настройкой
20.06.2026
WooCommerce: автоматическое отключение платёжных систем при неоплате заказов по IP
17.06.2026
WooCommerce: как использовать хуки для дополнительного отображения информации в корзине
02.06.2026