wpload.ru wordpress WPLoad.ru

WooCommerce: как автоматически удалять заказы по своим условиям с помощью хуков и кода

Диагностика задачи: зачем и когда нужно автоматическое удаление заказов в WooCommerce

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

Основная задача — настроить удаление заказов по собственным условиям, например, по статусу и возрасту заказа, используя стандартные хуки WooCommerce и чистый PHP-код без сторонних плагинов.

Как проверить текущую ситуацию с заказами

  • Зайдите в раздел WooCommerce → Заказы в админке.
  • Отфильтруйте заказы по статусам: отменён, ожидает оплаты, выполнен и т.д.
  • Посмотрите, сколько заказов с нужным статусом и как давно они созданы (дату можно увидеть в таблице заказов).
  • Определите, какие именно заказы нужно удалять автоматически (например, отменённые старше 30 дней).

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

Для автоматизации используем WP-Cron, чтобы запускать удаление заказов по расписанию. Код добавляется в файл functions.php вашей темы или в отдельный плагин.

1. Планируем задачу удаления заказов

if (!wp_next_scheduled('custom_delete_old_orders_event')) {
    wp_schedule_event(time(), 'daily', 'custom_delete_old_orders_event');
}

Этот код регистрирует ежедневное задание, которое будет запускать удаление.

2. Функция удаления заказов

add_action('custom_delete_old_orders_event', 'custom_delete_old_orders');

function custom_delete_old_orders() {
    $status = array('cancelled', 'failed', 'on-hold'); // статусы для удаления
    $days = 30; // заказы старше 30 дней
    
    $date_query = array(
        'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
        'inclusive' => true,
    );

    $args = array(
        'status' => $status,
        'date_created' => $date_query,
        'limit' => -1, // без лимита
        'return' => 'ids', // вернуть только ID заказов
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // удаляем заказ без перемещения в корзину
    }
}

3. Очистка задачи при деактивации темы или плагина

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

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

  • Подождите выполнение cron-задачи (по умолчанию — раз в сутки).
  • Для ручного запуска используйте WP-CLI или временно вызовите функцию напрямую:
    custom_delete_old_orders();
  • Зайдите в админку WooCommerce → Заказы и убедитесь, что заказы с указанными статусами и датами удалены.
  • Проверьте, что новые заказы с другими статусами не удаляются.

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

  • Крон-задача не запускается: убедитесь, что на сайте включён WP-Cron и на сайт заходят пользователи, иначе задачи не будут срабатывать. Для теста можно использовать плагин "WP Crontrol".
  • Удаление не происходит: проверьте правильность статусов в массиве $status — должны совпадать с зарегистрированными в WooCommerce (например, "cancelled", а не "отменён").
  • Удаляются лишние заказы: внимательно проверьте условие по дате и статусу; можно добавить логирование для отладки.
  • Ошибка из-за ограничения памяти или времени: при большом количестве заказов стоит добавить лимит и делать удаление пакетами, например, по 50 заказов за один запуск.

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

  • Удаляйте заказы только по строгим критериям, чтобы не потерять важные данные.
  • Используйте wp_delete_post с параметром true, чтобы полностью удалить заказ из базы.
  • Рассмотрите возможность бэкапа базы данных перед внедрением автоматического удаления.
  • Если заказов много, разбивайте удаление на пакеты, чтобы избежать таймаутов и перегрузки сервера.
  • Для мониторинга работы крон-задачи можно добавить запись в лог файл:
function custom_delete_old_orders() {
    // ...код удаления...
    error_log('Custom delete old orders ran: ' . count($orders) . ' orders deleted.');
}

Сравнение вариантов реализации

МетодПлюсыМинусыКомментарий
Плагин (например, WP Bulk Delete)Простота настройки, UIДополнительная нагрузка, зависит от стороннего кодаПодходит для админов без навыков кода
Код с WP-Cron и wc_get_ordersГибкость, контроль, нет стороннего ПОТребует навыков программированияЛучший вариант для разработчиков
Удаление вручную через SQLСкорость, прямой контрольРиск повреждения данных, сложностьТолько для опытных админов и разработчиков
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙