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

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

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

Чтобы выявить масштаб проблемы, выполните запрос к базе данных или используйте SQL-менеджер в phpMyAdmin:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');

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

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

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

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

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

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            array(
                'before' => $date,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление
        }
    }
}

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

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

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

add_action('wpkit_daily_order_cleanup', 'wpkit_delete_old_unpaid_orders');

3. Очистка расписания при деактивации плагина (если используется плагин)

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

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

  • Вручную создайте заказ с статусом pending и датой старше 7 дней (через базу или изменение даты публикации).
  • Запустите функцию wpkit_delete_old_unpaid_orders() вручную, вызвав ее через wp shell или временно добавив вызов в functions.php.
  • Убедитесь, что заказ удалился из списка заказов и из базы (wp_posts).
  • Отслеживайте логи сервера и WooCommerce на предмет ошибок.

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

  • Заказы не удаляются: Проверьте правильность статусов wc-pending, wc-failed. Иногда статусы могут быть кастомизированы, используйте wc_get_order_statuses() для проверки.
  • WP Cron не запускается: Для локальных сайтов WP Cron может не работать автоматически. Запустите вручную через WP-CLI wp cron event run --due-now или настройте системный cron.
  • Удаляются нужные заказы: Убедитесь, что условие с датой написано корректно, чтобы не удалить свежие заказы.
  • Проблемы с производительностью при большом числе заказов: Делайте удаление пакетами, например, по 50 заказов за раз, чтобы не перегружать сайт.

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

  • Добавьте проверку прав текущего пользователя, если запускаете удаление через админку.
  • Логируйте удалённые заказы для возможного восстановления или аудита.
  • Если сайт большой, используйте WP CLI скрипты для запуска удаления вне веб-сессии.
  • Проверяйте регулярность и успешность запуска cron-задания с помощью плагинов мониторинга, например, WP Crontrol.

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

МетодПлюсыМинусыРекомендуется для
WP Cron с кастомным кодом Полный контроль, бесплатный, гибкий Зависит от посещаемости сайта, требует навыков программирования Средние и крупные проекты с тех. поддержкой
Плагины очистки заказов Простая установка, готовые функции Меньше гибкости, могут конфликтовать с другими плагинами Малые магазины или без программистов
WP-CLI скрипты Высокая производительность, не зависит от WP Cron Нужен доступ к серверу, знания командной строки Большие проекты с серверным администрированием
Как создать интерактивные формы в WordPress без плагинов
01.12.2025
WooCommerce: как заблокировать оплату при наличии товаров с определёнными атрибутами в корзине
25.06.2026
Создание интерактивного графика работы в WordPress
28.03.2026
Как использовать хуки для оптимизации производительности WordPress
25.12.2025
Как настроить автоматическое удаление неактивных пользователей в WordPress
28.03.2026