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

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

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

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

1. Определяем нужные статусы для удаления

Чаще всего удаляют заказы со статусами:

  • cancelled (отменённые)
  • failed (неудачные)
  • pending (ожидают оплаты)

Выбирайте те, которые действительно не нужны для аналитики или повторных попыток оплаты.

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

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

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

    foreach ($statuses as $status) {
        // Получаем заказы со статусом
        $args = array(
            'post_type' => 'shop_order',
            'post_status' => 'wc-' . $status,
            'posts_per_page' => -1,
            'fields' => 'ids',
        );
        $orders = get_posts($args);

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

3. Автоматизация через WP-Cron

Чтобы удаление происходило автоматически, добавим задачу в WP-Cron, например, раз в неделю:

function wpapp_schedule_order_deletion() {
    if (!wp_next_scheduled('wpapp_delete_orders_event')) {
        wp_schedule_event(time(), 'weekly', 'wpapp_delete_orders_event');
    }
}
add_action('wp', 'wpapp_schedule_order_deletion');

add_action('wpapp_delete_orders_event', 'wpapp_delete_orders_by_status');

4. Удаление задачи при деактивации

Чтобы избежать мусора, удалим запланированное событие при деактивации плагина/темы:

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

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

  • Зайдите в админку WooCommerce → Заказы, отфильтруйте по статусам, которые указали в коде. Заказы с этими статусами должны отсутствовать.
  • Если хотите протестировать сразу, вызовите функцию wpapp_delete_orders_by_status() вручную, например, через WP-CLI:
    wp eval 'wpapp_delete_orders_by_status();'
  • Проверьте логи ошибок сервера и WooCommerce на предмет ошибок удаления.

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

  • Заказы не удаляются: Проверьте, что статусы указываются с префиксом wc- в post_status. Неверный статус вернёт пустой список.
  • Удаление не происходит автоматически: Убедитесь, что WP-Cron работает. Можно протестировать вручную через WP-CLI или плагин WP Crontrol.
  • Потеря важной информации: Проверьте список статусов перед удалением — иногда нужные заказы могут иметь похожие статусы.
  • Проблемы с производительностью при большом количестве заказов: Делайте удаление пакетами, добавьте пагинацию в запрос:
$args = array(
    'post_type' => 'shop_order',
    'post_status' => 'wc-' . $status,
    'posts_per_page' => 100, // пакет по 100 заказов
    'paged' => $page_number,
    'fields' => 'ids',
);

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

  • Резервное копирование: Перед внедрением автоматического удаления убедитесь, что есть свежие бэкапы базы данных.
  • Проверка прав: Функция удаления должна запускаться только с достаточными правами (обычно через WP-Cron это безопасно).
  • Логирование: Добавьте логирование удалённых заказов для аудита и восстановления:
function wpapp_delete_orders_by_status() {
    $statuses = array('cancelled', 'failed', 'pending');
    foreach ($statuses as $status) {
        $args = array(
            'post_type' => 'shop_order',
            'post_status' => 'wc-' . $status,
            'posts_per_page' => -1,
            'fields' => 'ids',
        );
        $orders = get_posts($args);
        foreach ($orders as $order_id) {
            if (wp_delete_post($order_id, true)) {
                error_log("[Order Deletion] Deleted order ID: $order_id with status $status");
            }
        }
    }
}

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

МетодПлюсыМинусыКомпромисс
Удаление вручную через админкуПросто, без кодаТрудоёмко, неэффективно при большом количествеПодходит для редких случаев
Код с WP-Cron (как в статье)Автоматизация, гибкостьТребует базовых знаний PHP и WP-CronЛучше для регулярного использования
Плагины для очистки WooCommerceГотовые решения, интерфейсМогут быть тяжёлыми, избыточнымиПодходит, если хотите без кода

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