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

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

WooCommerce накапливает большое количество заказов со статусами cancelled (отключён) и pending (ожидает оплаты). Это приводит к увеличению размера базы данных, замедлению бэкапа и снижению производительности административной панели. Особенно это критично для крупных магазинов с тысячами заказов.

Проверить количество заказов с указанными статусами можно через SQL-запрос к базе данных:

SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Если в ответе видно много wc-cancelled и wc-pending, стоит автоматизировать удаление устаревших заказов.

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

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

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

function wpscan_delete_old_orders() {
    $statuses = ['wc-cancelled', 'wc-pending']; // Статусы для удаления
    $days_to_keep = 30; // Срок хранения заказов
    $date_limit = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    foreach ($statuses as $status) {
        $args = [
            'post_type'      => 'shop_order',
            'post_status'    => $status,
            'date_query'     => [
                [
                    'column' => 'post_date',
                    'before' => $date_limit,
                ],
            ],
            'fields'         => 'ids',
            'posts_per_page' => -1,
        ];

        $orders = get_posts($args);
        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление
            }
        }
    }
}

2. Настройка автоматического запуска с помощью WP-Cron

Чтобы функция выполнялась автоматически, зарегистрируем событие WP-Cron, например, раз в сутки:

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

add_action('wpscan_daily_order_cleanup', 'wpscan_delete_old_orders');

3. Очистка расписания при деактивации плагина или отключении кода

Если код добавлен в плагин, важно удалить расписание при деактивации:

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

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

Для проверки работы решения:

  • Запустите функцию вручную в админке с помощью wpscan_delete_old_orders(); или используйте WP-CLI: wp eval 'wpscan_delete_old_orders();'
  • Проверьте количество заказов со статусом cancelled и pending до и после выполнения функции через SQL-запрос.
  • Убедитесь, что заказы действительно удалены, а не просто переведены в корзину (wp_delete_post с параметром true делает полное удаление).
  • Проверьте логи сервера на предмет ошибок во время выполнения WP-Cron.

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

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

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

  • Используйте полное удаление заказов wp_delete_post($order_id, true), чтобы не оставлять мусор в базе (метаданные, записи в таблицах WooCommerce).
  • Для больших магазинов добавьте логирование удалённых заказов с указанием ID и даты удаления для аудита.
  • Внедрите проверку nonce или ограничьте запуск функции только для администраторов, если добавляете кнопки ручного запуска в админке.
  • Оптимизируйте запросы, используя 'fields' => 'ids' в get_posts, чтобы снизить нагрузку.
  • Если заказов слишком много, используйте пагинацию по 100 заказов за раз, чтобы не превышать лимиты памяти и времени выполнения.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админку WooCommerceПросто, без кодаТрудоёмко при большом количестве заказовНебольшие магазины
Плагин для очистки заказов (например, WP Bulk Delete)Готовое решение с интерфейсомЗависимость от стороннего кода, возможные конфликтыСредние магазины без навыков кодинга
Кастомный код с WP-Cron (как в статье)Гибкость, контроль, минимальная нагрузкаТребует навыков разработки и тестированияКрупные магазины, требующие автоматизации
Как удалить заблокированные или замедленные заказы WooCommerce с помощью кода
01.05.2026
Как установить лимит на запросы REST API WordPress
02.04.2026
Как защитить WordPress от враждебных комментариев и спама: практические методы
15.03.2026
Как защитить WordPress от удаления аккаунта администратора
09.04.2026
Как отключить XML-RPC в WordPress: эффективные методы с примерами кода и плагинов
07.01.2026