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

Проблема: накопление отменённых заказов в WooCommerce

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

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

Для начала проверьте, сколько отменённых заказов хранится в базе. Для этого можно выполнить SQL-запрос через phpMyAdmin или любой другой инструмент работы с базой данных:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

Если число превышает несколько сотен, автоматизация удаления оправдана.

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

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

function wpdirect_delete_cancelled_orders() {
    global $wpdb;
    // Получаем ID отменённых заказов старше 30 дней
    $order_ids = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < NOW() - INTERVAL 30 DAY"
        )
    );

    if (empty($order_ids)) {
        return;
    }

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

2. Регистрируем WP-Cron событие для ежедневного запуска

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

add_action('wpdirect_daily_delete_cancelled_orders', 'wpdirect_delete_cancelled_orders');

3. Добавляем возможность запуска вручную из админки (опционально)

add_action('admin_post_wpdirect_manual_delete_cancelled', 'wpdirect_delete_cancelled_orders');

function wpdirect_add_manual_delete_button() {
    if (current_user_can('manage_woocommerce')) {
        echo '<form method="post" action="'.admin_url('admin-post.php').'">';
        echo '<input type="hidden" name="action" value="wpdirect_manual_delete_cancelled" />';
        submit_button('Удалить отменённые заказы вручную');
        echo '</form>';
    }
}
add_action('woocommerce_reports_orders', 'wpdirect_add_manual_delete_button');

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

  • Запустите функцию вручную через созданную кнопку или вызовите wpdirect_delete_cancelled_orders() из консоли WP-CLI: wp eval 'wpdirect_delete_cancelled_orders();'.
  • Проверьте количество отменённых заказов через SQL-запрос, приведённый выше.
  • Убедитесь, что в админке WooCommerce в разделе заказов отменённые заказы исчезли.
  • Для проверки работы cron можно использовать плагин WP Crontrol, чтобы увидеть, запланировано ли событие wpdirect_daily_delete_cancelled_orders и выполняется ли оно.

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

  • Ничего не удаляется: проверьте правильность временного интервала в SQL-запросе, убедитесь, что даты заказов корректно записаны и что посты имеют статус wc-cancelled.
  • Удаление слишком частое или не нужно каждый день: настройте интервал cron на еженедельный, заменив 'daily' на 'weekly' или создайте кастомный интервал.
  • Проблемы с производительностью при большом количестве заказов: удаляйте заказы частями, добавив лимит и пагинацию в запросы.
  • Функция не запускается: убедитесь, что WP-Cron работает (например, посетите сайт, чтобы запустить cron), либо настройте системный cron для вызова wp-cron.php.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, чтобы избежать накопления мусора в корзине.
  • Добавьте проверку прав доступа при запуске функции вручную, чтобы исключить несанкционированное удаление заказов.
  • Чтобы не нагружать базу, при большом объёме заказов внедрите пакетное удаление (например, по 50 заказов за один запуск).
  • Периодически оптимизируйте таблицы базы данных (через phpMyAdmin или WP-CLI) для поддержания производительности.
  • Если используете кеширование (Redis, Memcached), после удаления заказов — сбрасывайте кеш для актуализации данных.

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

МетодПлюсыМинусыПример
Ручное удаление через админку WooCommerceПросто, без кодаТрудозатратно, не подходит для большого объёмаУдаление по одному заказу или массовое выделение
Использование плагинов (например, WP Bulk Delete)Автоматизация, удобный интерфейсДополнительная нагрузка, зависит от обновлений плагинаПлагин с настройкой фильтров по статусу и дате
Кодовое решение с WP-Cron (как в статье)Гибкость, отсутствие сторонних плагинов, можно оптимизироватьТребует навыков разработки, возможны ошибки при неправильной настройкеФункция на PHP + wp_schedule_event
Как автоматизировать удаление старых комментариев в WordPress
14.03.2026
Как добавить собственные типы постов в WordPress
07.11.2025
WooCommerce: автоматическое изменение статуса заказа при отсутствии оплаты
22.06.2026
Как отключить автоматические обновления WordPress для плагинов и тем
21.03.2026
WooCommerce: автоматическое удаление отменённых заказов по расписанию с оптимизацией
19.06.2026