wpcorp.ru wordpress WP Corp

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

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

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

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

Если вы заметили следующие симптомы, стоит задуматься об очистке заказов:

  • Замедленная загрузка страниц админки WooCommerce — особенно вкладки «Заказы»;
  • Увеличение размера базы данных и длительность резервного копирования;
  • Высокое потребление ресурсов при работе с заказами;
  • Наличие большого количества заказов с статусом completed, cancelled или refunded, которые физически не нужны для отчетности.

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

1. Создание PHP-функции для выборки и удаления заказов

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

function wpcorp_delete_old_orders() {
    // Настройки: статусы и возраст заказов (в днях)
    $statuses = array('completed', 'cancelled', 'refunded');
    $days_old = 90; // удалить заказы старше 90 дней

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
    );

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => $statuses,
        'date_query' => array($date_query),
        'posts_per_page' => -1,
        'fields' => 'ids',
        'no_found_rows' => true,
    );

    $query = new WP_Query($args);

    if (empty($query->posts)) {
        return 0; // нет заказов для удаления
    }

    foreach ($query->posts as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление без корзины
    }

    return count($query->posts);
}

2. Автоматизация запуска через WP-Cron

Добавьте регистрацию и запуск задачи cron в тот же файл:

if (!wp_next_scheduled('wpcorp_delete_old_orders_cron')) {
    wp_schedule_event(time(), 'daily', 'wpcorp_delete_old_orders_cron');
}

add_action('wpcorp_delete_old_orders_cron', function() {
    $deleted_count = wpcorp_delete_old_orders();
    if ($deleted_count > 0) {
        error_log("[WooCommerce] Удалено старых заказов: {$deleted_count}");
    }
});

3. Ручной запуск через WP-CLI

Если есть доступ к консоли сервера, можно запускать удаление вручную:

wp eval 'echo wpcorp_delete_old_orders() . " заказов удалено.\n";'

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

Чтобы убедиться, что удаление сработало:

  • Проверьте логи сайта (error_log) на наличие записей о количестве удалённых заказов;
  • В админке WooCommerce сравните количество заказов до и после запуска скрипта;
  • Запустите WP-CLI команду для повторной проверки — количество заказов должно уменьшиться;
  • Проверьте размер базы данных и время загрузки страницы заказов.

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

  • Неправильные статусы заказов в массиве: убедитесь, что используете именно статусы заказов WooCommerce, а не статусы публикации WordPress. Используйте wc_get_order_statuses() для проверки.
  • Функция wp_delete_post не удаляет заказ: проверьте права пользователя и наличие блокировок базы данных.
  • cron-задача не запускается: убедитесь, что у вас настроен wp-cron или используйте системный cron для обращения к wp-cron.php.
  • При большом количестве заказов скрипт превышает лимит времени: разбейте удаление на партии с помощью параметра posts_per_page и запускайте несколько циклов.

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

  • Перед удалением обязательно создайте резервную копию базы данных.
  • Запускайте удаление в периоды минимальной нагрузки.
  • Используйте wp_delete_post($order_id, true) с параметром true для полного удаления без помещения в корзину.
  • Для больших магазинов реализуйте пакетную обработку — например, удалять по 100 заказов за один запуск.
  • Если ваш магазин работает с налоговой, убедитесь, что удаление заказов не нарушает законодательство.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудоемко, риск ошибок, не подходит для большого количества заказов
WP-CLI скриптБыстро, можно автоматизировать, подходит для больших базТребуется доступ к серверу и навыки работы с консолью
WP-Cron задачаПолная автоматизация, не требует участия пользователяМожет не запускаться при низком трафике, нужно контролировать
×
WPRemark
Внимание Внимание Внимание Внимание
-15%

на WPRemark плагин WordPress

Прокачай свой сайт! ⋙