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

Диагностика проблемы с неактивными заказами в WooCommerce

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

Проверьте, есть ли у вас такие заказы с помощью SQL-запроса к базе данных:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Если количество заказов большое и они неактивны, стоит подумать об автоматическом удалении таких записей.

Пошаговое решение: автоматическое удаление неактивных заказов через WP-Cron

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

function wpb_delete_old_inactive_orders() {
    global $wpdb;
    $statuses = ['wc-pending', 'wc-on-hold', 'wc-cancelled'];
    $placeholders = implode(",", array_fill(0, count($statuses), '%s'));

    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($placeholders) AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY)",
        ...$statuses
    );

    $order_ids = $wpdb->get_col($query);
    if (!empty($order_ids)) {
        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // true - удалить без перемещения в корзину
        }
    }
}

2. Регистрируем WP-Cron задачу для запуска функции раз в сутки

function wpb_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpb_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpb_daily_order_cleanup');
    }
}
add_action('wp', 'wpb_schedule_order_cleanup');
add_action('wpb_daily_order_cleanup', 'wpb_delete_old_inactive_orders');

3. Опционально: вручную проверить работу функции

add_action('admin_init', function() {
    if (isset($_GET['run_order_cleanup'])) {
        wpb_delete_old_inactive_orders();
        wp_redirect(admin_url());
        exit;
    }
});

После добавления этого кода в файл functions.php вашей темы или в отдельный плагин, заказы с указанными статусами и старше 30 дней будут удаляться автоматически каждый день.

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

  • В базе данных через phpMyAdmin или аналогичный инструмент выполните SQL-запрос выше и проверьте количество заказов до и после запуска задачи.
  • В админке WooCommerce проверьте список заказов — старые неактивные должны исчезать.
  • Временно добавьте вызов функции по GET-параметру ?run_order_cleanup, чтобы сразу протестировать удаление.

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

  • Задача WP-Cron не запускается: если на сервере мало трафика, WP-Cron может не запускаться автоматически. Решение — настроить системный cron (например, wget -q -O - https://example.com/wp-cron.php?doing_wp_cron).
  • Удаляются активные заказы: проверьте статусы в массиве $statuses, чтобы не включать те, что нужны для текущих продаж.
  • Память или время выполнения PHP превышены: при большом количестве заказов удаляйте их порциями, добавив лимит в SQL-запрос и повторяя удаление.

Практические советы по оптимизации и безопасности

  • Перед удалением сделайте резервную копию базы данных.
  • Используйте транзакции или пакетное удаление, чтобы избежать повреждения данных.
  • Добавьте логирование удалённых заказов для аудита.
  • Расширьте функцию, чтобы удалять и связанные метаданные из таблицы wp_postmeta.

Сравнение вариантов удаления старых заказов

МетодПлюсыМинусыКогда использовать
WP-Cron + PHP-скрипт (как в статье)Полный контроль, бесплатно, гибкоЗависит от WP-Cron, может требовать доработокМалые и средние магазины
Плагины для очистки заказов (например, WooCommerce Order Cleanup)Простая настройка, интерфейсМожет нагружать сайт, не всегда гибкоБыстрое решение без кода
SQL-запросы по расписанию через cron на сервереМаксимальная скорость и контрольТребует навыков DBA и доступа к серверуБольшие проекты с администратором БД
Как удалить или изменить slug в WordPress без потери SEO
14.11.2025
Как создать динамические поля в формах WordPress с помощью AJAX
28.01.2026
Как удалить данные пользователя из базы WordPress без ошибок
19.02.2026
WooCommerce: как автоматически отключать товары без остатков на складе
16.06.2026
Автоматическое удаление неактивных вариантов товаров в WooCommerce по расписанию
30.06.2026