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

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

Со временем база заказов WooCommerce может разрастаться, особенно если не все заказы актуальны. Неактивные и старые заказы занимают место в базе данных, замедляют работу административной панели и могут мешать при аналитике и отчетах.

Автоматическое удаление таких заказов поможет поддерживать чистоту данных и улучшит производительность магазина без необходимости ручного удаления.

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

Перед удалением важно понять, какие заказы считаются неактивными или старыми. Обычно это:

  • Заказы в статусах pending, failed или cancelled, которые не изменялись длительное время (например, 30+ дней).
  • Завершённые заказы со старым временем создания, которые уже не нужны для отчетности (например, старше 1 года).

Для диагностики выполните SQL-запрос к базе данных:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' ORDER BY post_date DESC LIMIT 10;

Это покажет последние 10 заказов с их статусами и датами. Проверьте статус и дату, чтобы понять, какие заказы можно считать устаревшими.

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

Реализуем функцию, которая будет по расписанию удалять заказы старше заданного срока с определёнными статусами.

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

function wpsocial_delete_old_orders() {
    $statuses_to_delete = array('wc-pending', 'wc-failed', 'wc-cancelled');
    $days_pending = 30; // Удалять заказы старше 30 дней
    $days_completed = 365; // Удалять завершённые заказы старше 365 дней

    $date_pending = date('Y-m-d H:i:s', strtotime("-{$days_pending} days"));
    $date_completed = date('Y-m-d H:i:s', strtotime("-{$days_completed} days"));

    // Удаляем неактивные статусы
    $args_pending = array(
        'post_type' => 'shop_order',
        'post_status' => $statuses_to_delete,
        'date_query' => array(
            array('before' => $date_pending),
        ),
        'fields' => 'ids',
        'posts_per_page' => -1,
    );

    $orders_pending = get_posts($args_pending);

    foreach ($orders_pending as $order_id) {
        wp_delete_post($order_id, true); // true - удаление без возможности восстановления
    }

    // Удаляем старые завершённые
    $args_completed = array(
        'post_type' => 'shop_order',
        'post_status' => 'wc-completed',
        'date_query' => array(
            array('before' => $date_completed),
        ),
        'fields' => 'ids',
        'posts_per_page' => -1,
    );

    $orders_completed = get_posts($args_completed);

    foreach ($orders_completed as $order_id) {
        wp_delete_post($order_id, true);
    }
}

2. Создание задачи WP-Cron для регулярного запуска

function wpsocial_schedule_old_orders_deletion() {
    if (!wp_next_scheduled('wpsocial_delete_old_orders_hook')) {
        wp_schedule_event(time(), 'daily', 'wpsocial_delete_old_orders_hook');
    }
}
add_action('wp', 'wpsocial_schedule_old_orders_deletion');
add_action('wpsocial_delete_old_orders_hook', 'wpsocial_delete_old_orders');

3. Как отключить автоматическое удаление

Чтобы остановить задачу, используйте:

function wpsocial_clear_old_orders_deletion_schedule() {
    $timestamp = wp_next_scheduled('wpsocial_delete_old_orders_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpsocial_delete_old_orders_hook');
    }
}

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

  • Проверьте наличие задачи в WP-Cron: в админке плагина WP Crontrol или через WP-CLI команду wp cron event list.
  • Убедитесь, что заказы с указанными статусами и датами удалились из базы wp_posts.
  • Проверьте логи ошибок сервера и лог плагина для диагностики возможных сбоев.
  • Для теста можно уменьшить порог дней, чтобы удаление сработало сразу.

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

  • Заказы не удаляются: проверьте, что функция подключена в functions.php темы или в плагине, и что WP-Cron работает (на некоторых хостингах требуется настройка внешнего триггера).
  • Удаляются не те заказы: проверьте корректность статусов. WooCommerce использует префикс wc- для статусов заказов.
  • Удаление вызывает ошибки базы данных: убедитесь, что у пользователя базы есть права на удаление записей, и что нет ограничений по времени выполнения скрипта.
  • Незначительное улучшение производительности: попробуйте дополнительно оптимизировать базу данных, используя плагины вроде Clearfy Pro для очистки и оптимизации.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления без помещения в корзину, чтобы не накапливать удалённые записи.
  • Регулярно делайте резервные копии базы, особенно перед запуском автоматических скриптов удаления.
  • Если база очень большая, разбивайте удаление на порции по 100–200 заказов, чтобы избежать таймаутов PHP.
  • Для больших магазинов лучше выполнять удаление через WP-CLI скрипты, вызываемые cron на сервере, а не WP-Cron.
  • Проверяйте, что ваши кастомные плагины или функции не зависят от удалённых заказов, чтобы избежать ошибок.

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

МетодПлюсыМинусы
WP-Cron + PHP (как в статье) Легко внедрить, не требует доступа к серверу WP-Cron зависит от посещений сайта, возможны задержки
WP-CLI скрипт на cron сервера Быстрее, надежнее, не зависит от посещаемости Требуется доступ к серверу и навыки администрирования
Плагины очистки WooCommerce Графический интерфейс, дополнительные функции оптимизации Могут влиять на производительность, не всегда гибкие настройки
Как создать автоматический календарь мероприятий в WordPress с фильтрацией и выводом
16.12.2025
WooCommerce: как автоматически удалять старые заказы по срокам
11.06.2026
Как создать собственный шорткод в WordPress с примером кода
22.11.2025
WP Social Login не работает: причины и решения
07.12.2025
WooCommerce: как автоматически удалять неактивные заказы по срокам
21.05.2026