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

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

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

Определяем критерии для удаления

Прежде чем реализовывать удаление, нужно чётко определить, какие заказы считаются «неактивными» и через какой срок их можно удалять.

  • Статусы заказа: чаще всего это «pending» (ожидает оплаты), «failed» (неудачный), «cancelled» (отменён).
  • Срок неактивности: например, 30 дней с момента создания заказа.

Эти параметры можно адаптировать под любую бизнес-логику.

Как реализовать автоматическое удаление заказов в WooCommerce

Самый надёжный способ — использовать WP Cron для периодического запуска функции, которая будет искать и удалять старые заказы с нужными статусами.

Код для удаления неактивных заказов

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

function wpb_delete_old_inactive_orders() {
    $days = 30; // сколько дней считать заказ неактивным
    $statuses = array('pending', 'failed', 'cancelled');

    $date_query = array(
        'column' => 'post_date',
        'before' => sprintf('- %d days', $days),
        'inclusive' => true,
    );

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => array_map( function($status) { return 'wc-' . $status; }, $statuses ),
        '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); чтобы удалять сразу
        }
    }
}

// Создаём событие, если его ещё нет
if (! wp_next_scheduled('wpb_daily_delete_inactive_orders') ) {
    wp_schedule_event(time(), 'daily', 'wpb_daily_delete_inactive_orders');
}

// Хук для запуска
add_action('wpb_daily_delete_inactive_orders', 'wpb_delete_old_inactive_orders');

Объяснение кода

  • Определяем переменную $days — заказы старше этого количества дней будут удалены.
  • Формируем массив статусов заказов для удаления, добавляя префикс wc-, который используется в статусах WooCommerce.
  • С помощью get_posts получаем ID заказов, соответствующих условиям.
  • Удаляем заказы с помощью wp_trash_post, так безопаснее — можно восстановить из корзины. Если нужна полная очистка, используйте wp_delete_post с параметром true.
  • Для автоматического запуска создаём событие WP Cron, которое будет выполняться ежедневно.

Как проверить, что автоматическое удаление работает

  1. Создайте тестовые заказы с статусами pending, failed, cancelled и датой создания более 30 дней назад.
  2. Вручную запустите функцию через WP CLI или временно добавьте вызов wpb_delete_old_inactive_orders(); в functions.php.
  3. Проверьте, что заказы переместились в корзину (раздел «Корзина» в заказах WooCommerce) или удалены, если использовался wp_delete_post.
  4. Для проверки работы WP Cron можно использовать плагин WP Crontrol — там увидеть запланированные задачи и запускать их вручную.

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

  • Удаляются не те заказы. Проверьте, что статусы в массиве $statuses корректны и с префиксом wc-. Например, wc-pending, а не просто pending.
  • Заказы не удаляются. Возможно, WP Cron не работает. Проверьте, активен ли DISABLE_WP_CRON в wp-config.php. Если да, настройте системный cron на вызов wp-cron.php или запускайте функцию вручную.
  • Удаление происходит слишком часто или слишком редко. Проверьте интервал запуска задачи wp_schedule_event — в примере стоит daily. Можно изменить на hourly или кастомный интервал.
  • Удаление вызывает сбои в работе сайта. Убедитесь, что удаление происходит в безопасное время и не блокирует другие процессы. Можно добавить логирование удалённых заказов для отладки.

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

  • Используйте wp_trash_post вместо немедленного удаления, чтобы иметь возможность восстановить случайно удалённые заказы.
  • Добавьте логирование удалённых заказов, например, в отдельный файл или в таблицу базы данных для аудита.
  • Проверьте, что удаление заказов не влияет на связанные данные, например, на отчёты или интеграции с CRM.
  • Если заказов очень много, разбивайте удаление на порции — например, не более 100 заказов за один запуск, чтобы избежать таймаута PHP.

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

МетодПлюсыМинусыРекомендуемость
Ручное удаление через админкуПростота, контрольТрудоёмко, не автоматизированоДля редких случаев
Плагин для очистки заказов (например, WooCommerce Order Cleaner)Удобный интерфейс, настройкиДополнительная нагрузка, зависимость от сторонних решенийДля магазинов без кастомных требований
Код с WP Cron (пример из статьи)Полный контроль, интеграция в кодТребует навыков, настройка cronЛучший вариант для разработчиков

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как создать динамические формы в WordPress с помощью REST API
25.11.2025
Как установить ограничения на сохранение данных через REST API в WordPress
28.02.2026
Как автоматизировать удаление спама в комментариях WordPress
13.02.2026
Как установить ограничения на сохранение данных через REST API в WordPress
12.04.2026
Как создать уникальный виджет в WordPress с применением PHP и хуков
21.11.2025
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее