WPExperts

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

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

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

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

  • В админке WooCommerce большое количество заказов со статусом pending или on-hold, созданных более 7-14 дней назад.
  • Замедление работы панели заказов или отчетов.
  • Накопление неоплаченных заказов, которые не переходят в статусы "завершено" или "отменено".

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

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

1. Добавляем новую задачу в расписание Cron

function wpexperts_register_daily_cron_schedule($schedules) {
    if (!isset($schedules['daily_2am'])) {
        $schedules['daily_2am'] = [
            'interval' => 86400, // 24 часа
            'display'  => __('Once Daily at 2 AM')
        ];
    }
    return $schedules;
}
add_filter('cron_schedules', 'wpexperts_register_daily_cron_schedule');

2. Регистрируем событие при активации темы или плагина

function wpexperts_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpexperts_cleanup_inactive_orders')) {
        // Запускать каждый день в 2:00 утра
        wp_schedule_event(strtotime('02:00:00'), 'daily_2am', 'wpexperts_cleanup_inactive_orders');
    }
}
add_action('wp', 'wpexperts_schedule_order_cleanup');

3. Создаем функцию обработки удаления заказов

function wpexperts_delete_old_pending_orders() {
    $days_threshold = 7; // кол-во дней, старше которых заказы удалять
    $date = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));

    $args = [
        'status' => ['pending', 'on-hold'],
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
        }
    }
}
add_action('wpexperts_cleanup_inactive_orders', 'wpexperts_delete_old_pending_orders');

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

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

  • Создайте тестовый заказ со статусом pending и датой создания старше 7 дней (можно вручную изменить дату в базе или через плагин для редактирования заказов).
  • Выполните вручную Cron-событие через WP-CLI или плагин для управления Cron, запустив действие wpexperts_cleanup_inactive_orders.
  • Проверьте, что заказ удалился из админки WooCommerce и что запись поста с этим ID отсутствует в таблице wp_posts.

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

  • Заказы не удаляются: проверьте, что функция wc_get_orders действительно возвращает ID заказов. Возможно, фильтр date_created задан неверно — используйте дебаг-печать var_dump($orders) для диагностики.
  • Cron-задача не запускается: убедитесь, что WordPress Cron работает (проверьте DISABLE_WP_CRON в wp-config.php). Если он отключен, используйте системный Cron на сервере.
  • Удаление заказов приводит к ошибкам: используйте wp_delete_post($order_id, true) для полного удаления с метаданными. Не применяйте wp_trash_post, чтобы не оставлять мусор.

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

  • Для больших магазинов с тысячами заказов разбивайте процесс удаления на пачки по 50-100 заказов, чтобы избежать тайм-аутов PHP.
  • Добавьте логирование удаленных заказов, записывая ID и дату удаления в файл или таблицу для аудита.
  • Ограничьте права доступа к функциям, связанным с удалением заказов, чтобы исключить возможность запуска посторонних пользователей.
  • Если используете сторонние плагины кеширования, сбрасывайте кеш после удаления заказов, чтобы изменения сразу отобразились.

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

МетодПлюсыМинусыРекомендации
WP Cron с PHP-кодом (как в статье)Гибкость, контроль, не требует сторонних плагиновЗависит от посещаемости сайта, возможны тайм-ауты при большом объемеИспользовать для средних магазинов, оптимизировать удаление пачками
Плагины очистки заказов (например, WooCommerce Order Cleaner)Простота настройки, интерфейс управленияДополнительная нагрузка, могут использовать общие настройки без гибкостиПодходит для новичков или быстро решения
Серверный Cron с WP-CLIНадежно, не зависит от трафикаТребует доступа к серверу и навыков CLIРекомендуется для больших магазинов и опытных админов
×
до 3225₽

Продавай темы и плагины WordPress!

Лови с каждой продажи

Начать ⋙