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

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

Большое количество незаконченных или «зависших» заказов в WooCommerce может негативно влиять на производительность сайта, загромождать базу данных и усложнять анализ продаж. Такие заказы чаще всего имеют статусы pending, failed или on-hold. Их регулярное удаление помогает поддерживать чистоту данных и ускорять работу административной части.

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

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

  • Статусы заказов: pending, failed, on-hold;
  • Возраст заказа: например, старше 7 дней;
  • Удаление происходит автоматически по расписанию WP-Cron.

2. Создаём функцию удаления заказов

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

function wpstandart_delete_old_wc_orders() {
    $statuses = array('wc-pending', 'wc-failed', 'wc-on-hold');
    $days_old = 7; // заказы старше 7 дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));

    $args = array(
        'status' => $statuses,
        '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); // помещаем в корзину
        }
    }
}

3. Регистрируем WP-Cron задачу

Добавьте расписание и хук в functions.php:

if (!wp_next_scheduled('wpstandart_daily_delete_orders')) {
    wp_schedule_event(time(), 'daily', 'wpstandart_daily_delete_orders');
}
add_action('wpstandart_daily_delete_orders', 'wpstandart_delete_old_wc_orders');

4. Очистка корзины заказов (опционально)

По умолчанию удалённые заказы попадают в корзину, их можно полностью удалить через дополнительную функцию:

function wpstandart_empty_orders_trash() {
    global $wpdb;
    $wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'trash'");
}
// Запускайте вручную или добавьте в WP-Cron по необходимости

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

  • Зайдите в WooCommerce → Заказы и проверьте наличие заказов со статусами pending, failed, on-hold старше 7 дней. Они должны отсутствовать или быть перемещены в корзину.
  • Проверьте логи WP-Cron (плагины типа WP Crontrol помогут) — должен запускаться хук wpstandart_daily_delete_orders раз в сутки.
  • Для тестирования можно временно уменьшить период в функции (например, до 1 часа) и создать тестовые заказы с нужным статусом и датой.

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

  • Заказы не удаляются: проверьте, что хук WP-Cron активен и не отключён на вашем хостинге. Для теста запустите функцию удаления вручную.
  • Удаляются не те заказы: внимательно проверьте массив статусов и формат даты. В WooCommerce статусы всегда с префиксом wc-.
  • Заказы не попадают в корзину: функция wp_trash_post() требует, чтобы пользователь имел права на удаление. Убедитесь, что код выполняется от имени администратора.

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

  • Не удаляйте заказы с пользовательскими статусами без проверки — это может повредить бизнес-логику.
  • Используйте WP-Cron с осторожностью — на слабых хостингах лучше настроить систему cron на сервере для запуска задачи.
  • Регулярно делайте резервные копии базы данных перед внедрением автоматических удалений.
  • Для крупных магазинов используйте пагинацию или лимит в запросе, чтобы избежать превышения лимитов памяти и времени выполнения.

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

МетодПлюсыМинусыПримечания
Код с WP-Cron (описанный выше) Гибко, бесплатно, контролируемо Зависит от WP-Cron, требует навыков программирования Лучше для разработчиков
Плагин (например, Advanced Order Cleanup) Просто использовать, есть UI Может влиять на производительность, меньше гибкости Удобно для новичков
Ручное удаление через админ-панель Безопасно, контроль над каждым заказом Трудоёмко, не автоматично Для редких случаев
Как создать собственный тип записи в WordPress с примером кода
09.01.2026
Использование хука woocommerce_order_status_changed для расширения функционала WooCommerce
07.05.2026
Как использовать WooCommerce order meta для дополнительных данных заказа
18.05.2026
Как правильно удалить или изменить URL продуктов в WooCommerce без потери SEO
17.04.2026
Как создать простой визуальный композитор в WordPress с примерами кода
17.11.2025