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

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

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

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

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

1. Определяем критерии для удаления заказов

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

  • completed — завершённые;
  • cancelled — отменённые;
  • failed — неудачные;

Также задаём возраст заказа, например, старше 90 дней.

2. Создаём функцию для удаления

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

function wpmart_delete_old_orders() {
    $days = 90; // количество дней
    $statuses = array('completed', 'cancelled', 'failed');
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ($statuses as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-' . $status,
            'date_query'     => array(
                array(
                    'column' => 'post_date',
                    'before' => $date,
                ),
            ),
            'posts_per_page' => -1,
            'fields'         => 'ids',
        );

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // true - без перемещения в корзину
            }
        }
    }
}

3. Регистрируем задачу WP-Cron для запуска удаления раз в сутки

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

add_action('wpmart_daily_order_deletion', 'wpmart_delete_old_orders');

4. Очистка расписания при деактивации

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

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

  • Проверьте наличие запланированного события через плагин WP Crontrol или вызовом wp_next_scheduled('wpmart_daily_order_deletion').
  • Запустите функцию вручную (например, вызвав wpmart_delete_old_orders() через консоль или временный хук) и убедитесь, что заказы со статусами и старше 90 дней удаляются.
  • Проверьте таблицу wp_posts в базе данных, что записи заказов исчезают.
  • В админке WooCommerce проверьте, что старые заказы отсутствуют.

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

  • Заказы не удаляются: проверьте права пользователя, от которого выполняется код, он должен иметь права администратора.
  • Задача WP-Cron не запускается: если сайт мало посещаемый, WP-Cron может не срабатывать. Рекомендуется настроить системный cron и отключить WP-Cron.
  • Удаляются не те заказы: проверьте параметры post_status и date_query в запросе.
  • Повышенная нагрузка при удалении: если заказов много, лучше делать удаление порциями, например, по 50 штук за один запуск.

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

  • Всегда делайте резервную копию базы перед активацией автоматического удаления.
  • Ограничьте права доступа к функциям удаления — не давайте запускать их через публичные хуки.
  • Для больших магазинов используйте пакетное удаление с пагинацией, чтобы избежать таймаутов.
  • Рассмотрите использование WP-CLI для ручного удаления больших объемов заказов, если cron не подходит.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, без кодаТрудоёмко, невозможно автоматизировать
Плагины для удаления заказовУдобный интерфейс, дополнительные настройкиДополнительная нагрузка, риск конфликтов
Код на WP-Cron (этот способ)Полный контроль, без лишних плагинов, гибкостьТребует базовых знаний PHP и WordPress, настройка cron
Как изменить URL страницы без перенаправления в WordPress
15.12.2025
Как удалить и изменить meta-robots в WordPress для SEO оптимизации
08.02.2026
WooCommerce: автоматическое удаление старых товаров по расписанию
27.06.2026
Как отключить автовоспроизведение изображений в WordPress
23.12.2025
Как создать собственный кustomный виджет в WordPress: пошаговое руководство
26.11.2025