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

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

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

Решение — автоматическое удаление таких заказов по дате, чтобы база оставалась чистой и производительность — высокой.

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

  • Проверьте количество заказов со статусом pending, failed и cancelled старше определённого срока, например, 30 дней.
  • Для этого используйте SQL-запрос в базе данных (через phpMyAdmin или терминал):
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Если число заказов большое (сотни и более), стоит автоматизировать их удаление.

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

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

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

function wpb_delete_old_inactive_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed', 'wc-cancelled'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '30 days ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => 100, // пакетная обработка
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // без возможности восстановления
        }
    }
}

2. Регистрируем WP-Cron событие

Добавим крон-задачу, которая будет запускать функцию ежедневно:

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

add_action('wpb_daily_order_cleanup', 'wpb_delete_old_inactive_orders');

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

Чтобы не оставлять лишние задания, добавьте отмену cron при деактивации:

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

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

  • Запустите функцию вручную, вызвав wpb_delete_old_inactive_orders() из консоли WP-CLI или временно через add_action('init', 'wpb_delete_old_inactive_orders'); и обновив сайт.
  • Проверьте в административной панели WooCommerce количество заказов с нужными статусами старше 30 дней — должны быть удалены.
  • Просмотрите логи сервера на наличие ошибок, связанных с удалением.
  • Для теста можно изменить дату в запросе на более свежую и проверить удаление.

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

  • Удаление не происходит: проверьте, что WP-Cron работает корректно. Для этого установите плагин WP Crontrol и убедитесь, что событие wpb_daily_order_cleanup запланировано.
  • Заказы не удаляются полностью: используйте wp_delete_post($order_id, true) с параметром true для полного удаления, иначе заказы перемещаются в корзину.
  • Перегрузка сервера при большом количестве заказов: ограничьте количество одновременно удаляемых заказов параметром posts_per_page и используйте пакетную обработку.
  • Удаление нужных заказов: убедитесь, что статус и дата фильтруются корректно, чтобы не удалить актуальные заказы.

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

  • Выполняйте удаление заказов пакетами (например, по 100 штук), чтобы не перегружать сервер.
  • Регулярно создавайте резервные копии базы данных перед автоматизацией удаления.
  • Если сайт высоконагруженный, используйте WP-CLI скрипты для удаления заказов вне веб-запросов.
  • Для безопасности ограничьте доступ к функциям удаления, не размещайте код в общедоступных шаблонах.
  • Используйте плагин Clearfy Pro для оптимизации базы и удаления мусорных данных как дополнение к собственным скриптам (https://wpshop.ru/plugins/clearfy).

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

Метод Плюсы Минусы Уровень контроля
Ручное удаление через админку Просто, не требует кода Много времени при большом объёме заказов Низкий
WP-Cron с пользовательским кодом Автоматизация, гибкость, пакетная обработка Требует навыков разработки, зависит от WP-Cron Высокий
Плагины очистки базы Удобство, дополнительные функции оптимизации Могут быть платными, не всегда под ваш кейс Средний

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как удалить удалённые комментарии из базы данных WordPress
05.12.2025
Как создать свой шорткод в WordPress: подробное руководство
04.11.2025
Как установить ограничения на сохранение данных через REST API в WordPress
12.04.2026
WooCommerce: как правильно удалять товары с очисткой связанных данных
03.05.2026
WooCommerce: автоматическое удаление неактивных заказов с применением WP-Cron
12.07.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее