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

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

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

Решение: автоматическое удаление заказов по сроку через WP-Cron

Для автоматизации процесса используем WP-Cron – планировщик заданий WordPress. Создадим функцию, которая будет удалять заказы старше заданного количества дней, и настроим расписание.

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

function wpsocial_delete_old_wc_orders() {
    $days = 30; // Удалять заказы старше 30 дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'status' => array('cancelled', 'failed', 'refunded'), // Статусы заказов для удаления
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Перемещаем в корзину
            // Для полного удаления используйте wp_delete_post($order_id, true);
        }
    }
}

2. Регистрация задачи WP-Cron

Добавим планировщик, который будет запускать функцию ежедневно:

add_action('wpsocial_daily_order_cleanup', 'wpsocial_delete_old_wc_orders');

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

3. Отключение задачи при деактивации темы или плагина

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

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

  • Выполните в консоли сайт запрос wp cron event run wpsocial_daily_order_cleanup (через WP-CLI) для моментального запуска.
  • Проверьте в админке WooCommerce список заказов с указанными статусами, дата создания которых старше 30 дней – они должны быть в корзине или удалены.
  • Для отладки добавьте логирование в функцию:
error_log('Удален заказ ID: ' . $order_id);

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает на сервере (иногда требуется реальный cron). Можно принудительно запустить через WP-CLI.
  • Удаляются не те заказы: Обратите внимание на статус заказов в параметре 'status'. Стандартные статусы: 'pending', 'processing', 'completed', 'cancelled', 'failed', 'refunded'. Убедитесь, что указали нужные.
  • База данных не уменьшается: Если используете wp_trash_post, заказы перемещаются в корзину, а не удаляются окончательно. Для полного удаления используйте wp_delete_post($order_id, true), но учитывайте, что восстановить данные будет нельзя.
  • Ошибка памяти или таймаута: Если заказов очень много, разделите удаление на порции, например, по 50 заказов за раз, используя параметр 'limit' и последовательно вызывайте функцию несколько раз.

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

  • Всегда делайте резервные копии базы перед автоматическим удалением заказов.
  • Используйте безопасные статусы заказов для удаления – не удаляйте 'completed' или 'processing', чтобы не потерять важные данные.
  • Запускайте WP-Cron через системный cron, если нагрузка сайта высока – это повысит надёжность.
  • Для повышения производительности удаляйте заказы пакетами, чтобы избежать перегрузки БД.
  • Логируйте процесс удаления для контроля и отладки.

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

МетодПлюсыМинусыПример кода
wp_trash_post (перемещение в корзину) Можно восстановить; безопаснее Не удаляет данные; база растёт
wp_trash_post($order_id);
wp_delete_post с true (полное удаление) Освобождает место в базе Нельзя восстановить; риск потери данных
wp_delete_post($order_id, true);
Вручную через SQL-запросы Максимальная скорость и контроль Риск повреждения базы; требует знаний Не рекомендуется без опыта
Как автоматически отклеивать комментарии в WordPress по опытным правилам
09.03.2026
WooCommerce: как настроить автоматическую отправку сообщений покупателям после заказа
28.04.2026
Как удалить ссылки на социальные сети из выводов WordPress
10.02.2026
WooCommerce: как настроить автоматическую отправку сообщений покупателям после заказа
01.06.2026
WooCommerce: как настроить автопостинг из ВКонтакте с фильтрацией и обработкой контента
04.07.2026