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

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

В больших интернет-магазинах WooCommerce накапливаются заказы с разными статусами, включая отменённые, ожидающие оплаты или старые черновики. Если не очищать базу, это снижает производительность и затрудняет администрирование. Автоматическое удаление заказов по сроку помогает поддерживать базу в чистоте без ручного вмешательства.

Типичные сценарии для удаления заказов:

  • Удаление отменённых заказов старше 30 дней.
  • Удаление заказов со статусом «ожидает оплаты» старше 7 дней.
  • Удаление черновиков заказов (auto-drafts) для очистки базы.

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

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

1. Создаём функцию удаления заказов по статусу и сроку

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

function wpt_delete_old_orders() {
    // Статусы заказов и сроки хранения в днях
    $order_statuses = [
        'cancelled' => 30,  // отменённые старше 30 дней
        'pending' => 7,     // ожидают оплаты старше 7 дней
        'failed' => 30      // неудачные старше 30 дней
    ];

    foreach ($order_statuses as $status => $days) {
        $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

        $args = [
            'status' => $status,
            'date_created' => '<' . $date,
            'limit' => -1,
            'return' => 'ids',
        ];

        $orders = wc_get_orders($args);

        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // перемещаем в корзину
        }
    }

    // Дополнительно: удалить auto-draft заказы старше 1 дня
    global $wpdb;
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'auto-draft' AND post_date < %s",
            date('Y-m-d H:i:s', strtotime('-1 day'))
        )
    );
}

2. Регистрируем крон-задачу для ежедневного запуска

Добавьте в functions.php следующий код для регистрации и планирования ежедневного события.

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

add_action('wpt_daily_delete_old_orders_event', 'wpt_delete_old_orders');

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

Чтобы предотвратить накопление ненужных крон-задач, добавьте очистку при деактивации.

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

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

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

  • Создайте тестовые заказы с нужным статусом и датой создания, например, 10 дней назад для статуса pending.
  • Запустите вручную функцию wpt_delete_old_orders() через консоль WP-CLI или временно вызовите её в коде.
  • Проверьте, что заказы перемещены в корзину в разделе «Заказы» админки WooCommerce.
  • Проверьте wp-cron: введите https://example.com/wp-cron.php?doing_wp_cron в браузере, чтобы запустить события, затем проверьте логи и заказы.

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

  • Заказы не удаляются: проверьте, что в wc_get_orders() корректно передаются параметры, статус заказа совпадает с реальным. Используйте var_dump для отладки.
  • WP-Cron не срабатывает: на некоторых хостингах cron требует внешнего вызова. Настройте системный cron на вызов wp-cron.php или используйте плагин для мониторинга.
  • Удаление не происходит из-за прав: убедитесь, что у пользователя сессии WP есть права на удаление постов типа shop_order.
  • Удаляются не те заказы: проверьте правильность сравнения дат и статусов, учитывайте часовой пояс сайта.

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

  • Для больших магазинов удаляйте заказы пакетами, чтобы не перегружать базу. Можно модифицировать код, добавив лимит и повторный запуск.
  • Используйте wp_trash_post(), а не wp_delete_post(), чтобы сохранить возможность восстановления заказов.
  • Регулярно проверяйте логи ошибок и производительности, чтобы убедиться, что крон-задача не тормозит сайт.
  • Для мониторинга cron-задач используйте плагин Clearfy Pro, который помогает управлять и оптимизировать задачи WP-Cron.

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

МетодПлюсыМинусыРекомендации
Плагин автоматического удаления заказовУдобство, готовые настройки, интерфейсМожет нагружать сайт, лишний код, риск конфликтовИспользовать для небольших магазинов или без опыта кода
Кастомный код с WP-Cron (как в статье)Лёгкий, быстрый, без сторонних зависимостей, можно кастомизироватьНеобходимы навыки, требует тестирования и поддержкиЛучше для опытных разработчиков и крупных магазинов
Удаление вручную через админкуПростота, нет кодаТрудоёмко, не автоматизируется, ошибки при больших объёмахПодходит для редких случаев
WooCommerce: автоматическое удаление заказов по срокам без плагинов
08.07.2026
Автоматическое отключение плагинов при возникновении ошибок в WordPress
08.04.2026
WooCommerce: автоматическое удаление заказов по сроку без плагинов
20.07.2026
Как создать автоматические отзывы на сайте WordPress с плагином Expert Review
22.12.2025
Оптимизация базы данных WordPress для улучшения производительности
04.01.2026