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

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

Неактивные заказы в WooCommerce — это заказы с определённым статусом, которые не были оплачены или подтверждены в течение длительного времени. Они занимают место в базе данных и могут влиять на отчёты и аналитику. Часто администраторы хотят автоматически очищать такие заказы, но при этом важно не удалить случайно активные или нуждающиеся во внимании заказы.

Типичные статусы, которые считаются неактивными для удаления:

  • pending — ожидает оплаты;
  • failed — оплата не прошла;
  • cancelled — отменённые заказы;
  • on-hold — заказ на удержании без оплаты.

Основная задача — удалить заказы, которые не изменялись в течение заданного периода времени (например, 30 дней).

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

1. Создание WP-Cron задачи для регулярной проверки

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

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

2. Функция удаления заказов с подтверждением

Перед удалением добавим дополнительную проверку — отправку письма админу с предложением подтвердить удаление. Для примера реализуем удаление без подтверждения, но оставим комментарии, как добавить логику подтверждения через email.

add_action('delete_old_woocommerce_orders', 'delete_inactive_orders_callback');
function delete_inactive_orders_callback() {
    $days = 30; // Период неактивности
    $args = array(
        'limit' => -1,
        'status' => array('pending', 'failed', 'cancelled', 'on-hold'),
        'date_created' => '<' . (time() - DAY_IN_SECONDS * $days),
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        // Здесь можно отправить email с запросом подтверждения удаления
        // Для упрощения сразу удаляем
        $order->delete(true);
    }
}

3. Отправка email с подтверждением (опционально)

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

  1. Собрать список заказов для удаления и отправить администратору письмо с ссылкой на подтверждение.
  2. Реализовать обработчик ссылки, который выполнит удаление заказов.

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

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

  • Убедитесь, что в админке WooCommerce заказы со статусами pending, failed, cancelled, on-hold и датой создания старше 30 дней исчезают автоматически после запуска WP-Cron.
  • Для проверки запустите задачу вручную в консоли или добавьте временный вызов функции delete_inactive_orders_callback(); в файл functions.php.
  • Проверьте логи ошибок сервера на предмет проблем с WP-Cron.

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

  • WP-Cron не запускается автоматически: на некоторых хостингах WP-Cron требует внешнего вызова. Решение: настройте системный cron на вызов wp-cron.php или используйте плагин для мониторинга WP-Cron.
  • Удаляются нужные заказы: Проверьте фильтр по статусам и дате создания. Возможно, стоит увеличить период неактивности.
  • Ошибка при вызове wc_get_orders с параметром date_created: используйте массив с ключом 'before' для корректной работы:
    'date_created' => array('before' => date('Y-m-d', strtotime('-30 days')))

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

  • Удаление заказов — необратимая операция. Рекомендуется делать резервную копию базы данных перед внедрением.
  • Для больших сайтов с тысячами заказов лучше обрабатывать удаление по частям, чтобы избежать превышения лимита памяти или времени исполнения.
  • Используйте транзакции базы данных при массовом удалении, если позволяет хостинг.
  • Для подтверждения удаления используйте nonce и защищённые ссылки, чтобы исключить несанкционированный доступ.
  • Регулярно проверяйте логи WP-Cron, чтобы убедиться в корректной работе задачи.

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

МетодПлюсыМинусыПрименимость
Простое удаление через WP-CronПростота, быстрое внедрениеНет подтверждения, риск удаления нужных заказовМалые и средние сайты, доверенные админы
Удаление с email-подтверждениемБезопасность, контрольСложность реализации, требует доп. интерфейсаКрупные сайты с большим количеством заказов
Удаление вручную через админку или плагиныМаксимальный контрольРучной труд, не автоматичноМалые сайты, без частых заказов
Как удалить или изменить атрибуты изображений в WordPress без плагинов
31.03.2026
Решение проблем с хостингом для WooCommerce в WordPress
08.12.2025
WooCommerce: автоматическая регистрация пользователя при оформлении заказа без регистрации
23.06.2026
Создание динамического файлового каталога в WordPress: практическое руководство
24.02.2026
WooCommerce: отключение автоподгрузки корзины и настройка обновления без перезагрузки страницы
28.05.2026