WooCommerce: автоматическое удаление заказов через 30 дней с подтверждением

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

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

Типовые сценарии, когда полезна автоматизация удаления заказов:

  • Удаление завершённых или отменённых заказов старше 30 дней;
  • Автоматическая очистка базы от неоплаченных или отменённых заказов с целью уменьшения нагрузки;
  • Поддержание порядка без ручного вмешательства.

Пошаговое решение: как настроить автоматическое удаление заказов через 30 дней

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

Добавим в functions.php вашей темы (или в отдельный плагин) следующий код, который будет удалять заказы старше 30 дней со статусом 'completed' или 'cancelled'. Важно, чтобы удаление было безопасным и с подтверждением в логах.

function wps_remove_old_woocommerce_orders() {
    // Параметры даты - заказы до 30 дней назад
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime('-30 days')),
    );

    // Статусы заказов для удаления
    $statuses = array('completed', 'cancelled');

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

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_trash_post($order_id); // Можно использовать wp_delete_post($order_id, true) для полного удаления
                error_log('WooCommerce: удалён заказ ID ' . $order_id . ' со статусом ' . $status);
            }
        }
    }
}

2. Настройка WP-Cron для регулярного запуска

Добавим событие в планировщик задач WordPress для запуска функции раз в сутки:

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

add_action('wps_daily_order_cleanup', 'wps_remove_old_woocommerce_orders');

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

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

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

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

  • Создайте тестовый заказ с нужным статусом (completed или cancelled) и датой старше 30 дней (можно изменить дату вручную в базе или через плагины).
  • Вручную запустите функцию wps_remove_old_woocommerce_orders() из консоли WP-CLI (wp eval 'wps_remove_old_woocommerce_orders();'), или временно вызовите её в шаблоне.
  • Проверьте, что заказ перенесён в корзину или удалён, а в debug.log появились записи об удалении.
  • Убедитесь, что при следующем запуске WP-Cron (например, с помощью плагина WP Crontrol) заказы старше 30 дней удаляются автоматически.

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

  • Заказы не удаляются: проверьте статус заказов, они должны быть именно с префиксом wc- в post_status (например, wc-completed), и дата должна быть корректной.
  • Функция не запускается по расписанию: убедитесь, что WP-Cron работает на сервере или настройте реальный системный cron для wp-cron.php.
  • Удаление происходит слишком быстро или слишком медленно: при большом количестве заказов стоит добавлять лимит по количеству удаляемых заказов за раз и запускать функцию несколько раз, чтобы не нагружать сервер.
  • Удалённые заказы нельзя восстановить: используйте wp_trash_post() вместо wp_delete_post(), чтобы иметь возможность восстановить заказы из корзины.

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

  • Запускайте удаление в off-peak часы, чтобы минимизировать влияние на производительность сайта.
  • Создавайте резервные копии базы перед внедрением автоматического удаления.
  • Логируйте удаление заказов в отдельный файл для аудита и восстановления при ошибках.
  • Если база очень большая, разбивайте удаление на порции с помощью параметра posts_per_page и передавайте оффсет.
  • По возможности внедряйте очистку на уровне сервера (SQL-запросы), но аккуратно, чтобы не повредить связанные данные.

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

МетодОписаниеПлюсыМинусы
wp_trash_post()Перемещает заказ в корзину (trash)Безопасно, можно восстановитьНе освобождает место сразу
wp_delete_post(true)Удаляет заказ безвозвратноОсвобождает место в базеНельзя восстановить, риск потери данных
SQL-запросы напрямуюУдаление через SQL (напр. DELETE из wp_posts и wp_postmeta)Быстро при больших объёмахРиск повреждения данных, требует опыта
Создание собственных типов записей (Custom Post Types) в WordPress с примерами кода
31.01.2026
WooCommerce: как автоматически удалять заказы после их архивирования с подтверждением
29.06.2026
Как добавить AJAX фильтрацию товаров в WordPress для малого бизнеса
14.03.2026
WooCommerce: как автоматически удалять товары после продажи
17.06.2026
Как удалить пустые категории в WordPress с помощью кода
08.04.2026