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

Проблема: зачем автоматически удалять заказы в WooCommerce

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

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

Для начала убедитесь, что в магазине есть заказы с нужными статусами. Для этого в админке WooCommerce перейдите в раздел Заказы и отфильтруйте по статусу, например, cancelled или failed. Если таких заказов много (сотни и более), автоматизация оправдана.

Проверьте размер таблицы wp_posts и wp_postmeta в базе данных, чтобы убедиться, что старые заказы занимают много места. Это можно сделать через phpMyAdmin или с помощью плагинов аналитики базы.

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

1. Создаем функцию для удаления заказов

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:

function wpapp_delete_orders_by_status() {
    // Указываем статусы заказов для удаления
    $statuses_to_delete = array('cancelled', 'failed', 'pending');

    foreach ($statuses_to_delete as $status) {
        // Запрос заказов с нужным статусом
        $orders = wc_get_orders(array(
            'limit' => -1, // без ограничения
            'status' => $status,
            'return' => 'ids',
        ));

        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление
        }
    }
}

2. Регистрируем задачу WP-Cron

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

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

add_action('wpapp_daily_order_cleanup', 'wpapp_delete_orders_by_status');

3. Альтернативный вариант: запуск через серверный cron

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

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

Замените example.com на ваш домен и настройте запуск, например, раз в ночь.

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

  • После первого запуска задачи проверьте в админке WooCommerce раздел Заказы, отфильтрованный по статусам, указанных в скрипте. Заказы с этими статусами должны быть удалены.
  • Проверьте логи сервера или плагина для отладки cron, чтобы убедиться, что задача выполняется без ошибок.
  • Для дополнительной проверки можно временно добавить логирование в функцию удаления:
function wpapp_delete_orders_by_status() {
    $statuses_to_delete = array('cancelled', 'failed', 'pending');
    foreach ($statuses_to_delete as $status) {
        $orders = wc_get_orders(array(
            'limit' => -1,
            'status' => $status,
            'return' => 'ids',
        ));
        error_log("Удаляем заказы со статусом: $status, количество: " . count($orders));
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
            error_log("Удален заказ ID: " . $order_id);
        }
    }
}

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

  • Удаление не происходит: Проверьте, что задача WP-Cron запущена. Для теста вызовите функцию вручную через wp shell или временно добавьте вызов wpapp_delete_orders_by_status(); в functions.php.
  • Невозможно удалить заказ: Убедитесь, что используете wp_delete_post($order_id, true); с параметром true для принудительного удаления, иначе заказ будет перемещен в корзину.
  • Удаляются лишние заказы: Проверьте массив статусов в $statuses_to_delete, чтобы случайно не удалить важные заказы. Можно добавить проверку по дате создания для удаления только старых заказов.
  • WP-Cron не запускается на сервере без посещений: Настройте системный cron для вызова wp-cron.php вручную.

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

  • Добавьте ограничение по дате, чтобы не удалять слишком свежие заказы, например:
$date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));

$orders = wc_get_orders(array(
    'limit' => -1,
    'status' => $status,
    'date_created' => '<' . $date_limit,
    'return' => 'ids',
));
  • При больших объемах заказов разбивайте удаление на порции, чтобы избежать таймаутов и нагрузки.
  • Всегда делайте резервное копирование базы перед автоматическим удалением.
  • Логируйте действия, чтобы можно было отследить удаленные заказы и восстановить в случае ошибки.

Таблица сравнения методов удаления заказов

МетодПлюсыМинусыКогда использовать
WP-Cron с wp_delete_postПростота, не требует доступа к серверуЗависит от посещаемости сайта, возможны задержкиМалые и средние магазины, без доступа к серверу
Системный cron + WP-CronНадежность, регулярность запускаНеобходим доступ к серверу и навыки настройкиБольшие магазины, критичные задачи
Ручное удаление в админкеКонтроль, минимальный риск ошибокТрудоемко, не подходит для большого объемаМалый объем заказов, разовые очистки

Наш каталог плагинов WordPress