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

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

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

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

1. Определение условий удаления

Рекомендуется удалять только заказы с определёнными статусами и старше заданного количества дней. Например, удалить отменённые и не оплаченные заказы старше 30 дней.

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

Добавим хук, который будет запускаться ежедневно и удалять старые заказы.

<?php
// Регистрируем событие при активации темы/плагина
function wpstuff_schedule_cleanup_cron() {
    if ( ! wp_next_scheduled( 'wpstuff_cleanup_old_orders' ) ) {
        wp_schedule_event( time(), 'daily', 'wpstuff_cleanup_old_orders' );
    }
}
add_action( 'wp', 'wpstuff_schedule_cleanup_cron' );

// Удаляем событие при деактивации
function wpstuff_clear_cleanup_cron() {
    $timestamp = wp_next_scheduled( 'wpstuff_cleanup_old_orders' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpstuff_cleanup_old_orders' );
    }
}
register_deactivation_hook( __FILE__, 'wpstuff_clear_cleanup_cron' );

3. Функция удаления заказов

Сам код, который выполнит удаление заказов по заданным критериям.

add_action( 'wpstuff_cleanup_old_orders', 'wpstuff_delete_old_orders' );

function wpstuff_delete_old_orders() {
    $days = 30; // Параметр - заказы старше 30 дней
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $statuses = array( 'wc-cancelled', 'wc-failed', 'wc-refunded' ); // статусы для удаления

    $args = array(
        'status' => $statuses,
        'date_created' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // Удаляем заказ полностью
    }
}

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

  • В базе данных wp_posts должны исчезнуть записи с post_type = 'shop_order' и статусами из списка старше 30 дней.
  • Можно вручную создать несколько тестовых заказов с нужными статусами и датой, чтобы проверить срабатывание крона после вызова wpstuff_delete_old_orders() вручную.
  • Для отладки временно замените wp_schedule_event на вызов функции сразу при загрузке админки:
add_action( 'admin_init', 'wpstuff_delete_old_orders' );

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

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

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

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

  • Всегда делайте резервную копию базы данных перед внедрением автоматических операций удаления.
  • Если заказов очень много, разбивайте удаление на партии (например, по 50 заказов за раз), чтобы не перегружать сервер.
  • Используйте wp_delete_post( $order_id, true ) для полного удаления, иначе заказ попадёт в корзину — что не освобождает место.
  • Проверяйте логи ошибок сервера и WordPress для выявления проблем с кронами.

Сравнение подходов: плагин vs код vs компромисс

ПодходПлюсыМинусыКогда использовать
Готовый плагин (например, WP Sweep, Advanced Database Cleaner)Простота настроек, UI, дополнительные функции очисткиМожет удалять лишние данные, нагрузка при больших базахДля непрофессионалов и комплексной чистки базы
Собственный код с WP-Cron (как в статье)Точный контроль, минимальная нагрузка, гибкостьТребует навыков, нужно тестироватьДля разработчиков и кастомных решений
Ручная очистка через админкуПростота, мгновенный контрольТрудозатратно, риск пропуска заказовМалые магазины с небольшим объемом заказов
Как создать собственный плагин оптимизации базы данных WordPress
31.01.2026
Как безопасно выполнять пользовательский PHP код в WordPress
21.03.2026
Как создать динамическую форму обработки данных в WordPress
16.01.2026
Как отключить AJAX в WooCommerce без потери функциональности
21.04.2026
Как создать автоматический импорт контента в WordPress с помощью WP REST API и плагинов
05.02.2026