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

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

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

Как понять, что проблема есть?

  • В админке WooCommerce в разделе Заказы много заказов в статусе pending или failed, которые не изменяются длительное время.
  • Отчёты по продажам показывают некорректные данные из-за множества неактивных заказов.
  • Производительность сайта падает при большом количестве заказов в базе.

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

Для автоматического удаления неоплаченных заказов через заданное время и ведения отчёта предлагается создать кастомный WP-Cron с функцией, которая:

  1. Выбирает заказы со статусом pending или failed, старше указанного времени (например, 48 часов).
  2. Удаляет их из базы WooCommerce.
  3. Записывает сведения об удалённых заказах в отдельный файл отчёта.

1. Регистрируем WP-Cron

add_action('wp', function() {
    if (!wp_next_scheduled('wc_auto_delete_unpaid_orders_event')) {
        wp_schedule_event(time(), 'hourly', 'wc_auto_delete_unpaid_orders_event');
    }
});

2. Функция удаления заказов и записи отчёта

add_action('wc_auto_delete_unpaid_orders_event', function() {
    $cutoff = strtotime('-48 hours');
    $args = [
        'status' => ['pending', 'failed'],
        'date_created' => '<' . date('Y-m-d H:i:s', $cutoff),
        'limit' => -1,
        'return' => 'ids',
    ];

    $order_ids = wc_get_orders($args);
    if (empty($order_ids)) {
        return;
    }

    $deleted_orders = [];
    foreach ($order_ids as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            $deleted_orders[] = [
                'ID' => $order_id,
                'date' => $order->get_date_created()->date('Y-m-d H:i:s'),
                'total' => $order->get_total(),
                'status' => $order->get_status(),
            ];
            wp_delete_post($order_id, true);
        }
    }

    // Запись отчёта
    $log_path = WP_CONTENT_DIR . '/uploads/unpaid_orders_deletion_log.csv';
    $is_new_file = !file_exists($log_path);
    $handle = fopen($log_path, 'a');
    if ($is_new_file) {
        fputcsv($handle, ['Order ID', 'Date Created', 'Total', 'Status']);
    }
    foreach ($deleted_orders as $data) {
        fputcsv($handle, [$data['ID'], $data['date'], $data['total'], $data['status']]);
    }
    fclose($handle);
});

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

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

  • Создайте тестовый заказ с статусом pending и датой создания более 48 часов назад (можно вручную изменить дату в базе для теста).
  • Запустите выполнение WP-Cron вручную через плагин WP Crontrol или воспользуйтесь WP-CLI командой wp cron event run wc_auto_delete_unpaid_orders_event.
  • Проверьте, что заказ удалён из админки WooCommerce.
  • Откройте файл отчёта wp-content/uploads/unpaid_orders_deletion_log.csv и убедитесь, что информация о заказе записана.

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

  • Отсутствие запланированного события WP-Cron: Убедитесь, что функция wp_schedule_event вызывается и событие не дублируется. Проверьте с помощью плагина WP Crontrol.
  • Права на запись в папку uploads: Если файл отчёта не создаётся, проверьте права доступа к директории wp-content/uploads.
  • Неправильное время сравнения дат: Для фильтрации по дате используйте правильный формат даты и часовой пояс сайта.
  • Удаление заказов не происходит: Убедитесь, что в выборке действительно есть подходящие заказы, и что функция вызывается (проверяйте логи ошибок PHP).

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

  • Безопасность: Не выводите содержимое отчёта публично. Если нужен доступ к отчёту, организуйте его через защищённый админ-интерфейс.
  • Производительность: Запускайте удаление не чаще одного раза в час, чтобы не создавать нагрузку.
  • Бэкапы: Перед внедрением автоматического удаления обязательно сделайте резервную копию базы данных.
  • Логирование: Храните не более нескольких последних отчётов, чтобы не переполнять дисковое пространство.

Сравнение вариантов удаления неоплаченных заказов

МетодПлюсыМинусыКомпромисс
Ручное удаление через админкуПростота, контрольЗатратно по времениПодходит для небольших магазинов
Плагины автоматизацииГотовые решения, GUIМогут нагружать сайт, лишний функционалХорошо для непрофессионалов
Кастомный WP-Cron с отчётомГибкость, прозрачность, лёгкость поддержкиТребует навыков разработкиОптимален для опытных разработчиков
Как закрыть дубли страниц от индексации в WordPress без поломки SEO
22.08.2026