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

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

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

  • Снизить нагрузку на базу данных;
  • Упростить интерфейс управления заказами;
  • Избежать путаницы с долгими неоплаченными заказами;
  • Автоматизировать рутинные задачи менеджера.

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

Шаг 1. Создание WP-Cron задачи

Добавим планировщик, который будет запускать функцию удаления заказов ежедневно.

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

Шаг 2. Хук и функция удаления заказов

Определим функцию, которая найдет и удалит неоплаченные заказы старше заданного срока (например, 3 дня).

add_action('wpall_delete_unpaid_orders_daily', function() {
    $days_limit = 3; // количество дней
    $date_limit = date('Y-m-d H:i:s', strtotime('-' . $days_limit . ' days'));

    $args = [
        'status' => ['pending', 'failed'],
        'date_created' => '<' . $date_limit,
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

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

Шаг 3. Отключение WP-Cron (опционально)

Для повышения производительности на больших сайтах можно отключить стандартный WP-Cron и запускать задачи через системный cron сервера.

define('DISABLE_WP_CRON', true);

И добавить вызов в crontab:

wget -q -O - 'https://example.com/wp-cron.php?doing_wp_cron' >/dev/null 2>&1

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

Чтобы убедиться, что удаление работает:

  1. Создайте тестовый заказ со статусом pending и датой создания старше 3 дней (можно изменить дату напрямую в базе или через SQL-запрос).
  2. Запустите вручную задачу, вызвав действие:
do_action('wpall_delete_unpaid_orders_daily');

После вызова проверьте, удалился ли заказ в админке WooCommerce и в базе данных (таблица wp_posts и wp_postmeta).

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

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

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

  • Резервное копирование: Перед автоматическим удалением заказов настройте регулярное резервное копирование базы данных, чтобы можно было восстановить данные при необходимости.
  • Логирование удаления: Добавьте логирование ID удаленных заказов в отдельный файл для аудита и отладки.
  • Оптимизация запросов: Используйте limit => -1 с осторожностью, если заказов очень много — можно реализовать постраничное удаление.
  • Проверка зависимостей: Убедитесь, что удаление заказов не конфликтует с другими плагинами, например, системами учёта или аналитикой.

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

МетодПреимуществаНедостаткиПример
Плагин (например, WooCommerce Cleanup)Прост в установке, не требует кодаМожет быть избыточным, нагрузка, ограничения настройкиПлагины на WP.org
Код с WP-Cron (описанный выше)Гибкость, контроль, интеграция в тему/плагинТребует навыков, возможны ошибки при неправильной настройкеWP-Cron + wc_get_orders + wp_delete_post
Ручное удаление через SQLСамый быстрый способ для больших объемовРиск ошибок, потеря данных, требует резервного копированияDELETE из wp_posts и wp_postmeta
WooCommerce: автоматическое удаление неоплаченных заказов по срокам
19.05.2026
Как удалить или скрыть версию WordPress без плагинов
06.02.2026
WordPress авторизация по одноразовому паролю (OTP) с практическим применением
30.01.2026
Как избежать конфликтов между плагинами WordPress — практические решения и примеры кода
29.11.2025
Как удалить старые папки и файлы из медиабиблиотеки WordPress
26.02.2026