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

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

Незаконченные (или "отложенные") заказы накапливаются в WooCommerce, если пользователь начал оформление, но не завершил покупку. Это приводит к перегрузке базы данных, снижению производительности и усложняет аналитику. Как правило, такие заказы имеют статус pending, failed или on-hold, и часто остаются навсегда, если не настроить их автоматическую очистку.

Проверить наличие таких заказов можно через админку WooCommerce или напрямую из базы данных:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-on-hold');

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

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

Добавим функцию, которая будет удалять заказы старше определённого количества дней и с нужным статусом:

function wc_delete_old_unfinished_orders() {
    $days = 7; // Количество дней, после которых заказы считаются устаревшими
    $statuses = array('wc-pending', 'wc-failed', 'wc-on-hold');

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => "$days days ago",
            ),
        ),
        '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

Чтобы запускать очистку автоматически, добавим WP-Cron задачу:

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

add_action('wc_delete_old_orders_event', 'wc_delete_old_unfinished_orders');

3. Отмена расписания (при необходимости)

Если потребуется отключить автоматическую очистку:

function wc_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wc_delete_old_orders_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_old_orders_event');
    }
}

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

Проверьте в админке WooCommerce наличие заказов с нужными статусами старше 7 дней. После запуска cron-задачи (можно вызвать вручную через WP CLI wp cron event run wc_delete_old_orders_event или дождаться следующего запуска), эти заказы должны исчезнуть.

Для проверки через базу данных используйте запрос из раздела диагностики и убедитесь, что старые заказы удалены.

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

  • Функция не запускается автоматически — проверьте, что WP-Cron работает на вашем сайте. Если сайт мало посещаемый, WP-Cron не запускается автоматически. Решение: настроить системный cron на сервере.
  • Удаляются не те заказы — перепроверьте параметры $statuses и дату в date_query. Статусы должны содержать префикс wc-.
  • Заказы не удаляются полностью — используйте wp_delete_post($order_id, true) для полного удаления, иначе заказы могут только переходить в корзину.
  • Низкая производительность при большом количестве заказов — ограничьте число удаляемых заказов в одном запуске, добавив параметр posts_per_page (например, 100), и используйте повторный запуск cron.

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

  • Перед внедрением автоматического удаления сделайте резервную копию базы данных.
  • Для крупных магазинов стоит реализовать удаление партиями, чтобы не нагружать сервер.
  • Проверяйте логи ошибок сервера и WordPress, чтобы отследить возможные сбои cron-задачи.
  • Если используете сторонние плагины для очистки заказов, сравните их с кастомным кодом (таблица ниже).

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

МетодПлюсыМинусыКомпромисс
Кастомный код с WP-CronПолный контроль, бесплатно, легко адаптироватьТребует навыков, зависит от WP-CronИспользовать системный cron для надежности
Плагины очистки заказов (например, WooCommerce Order Cleaner)Удобно, поддержка, настройки через UIМожет быть платным, лишний код на сайтеИспользовать для быстрого решения, переходить на код при масштабировании
Ручное удаление через админкуПросто, без риска ошибок в кодеТрудозатратно, не автоматичноИспользовать при небольшом количестве заказов
Отключение AJAX добавления товара в корзину WooCommerce на отдельных страницах
13.06.2026
Как удалить автоматические черновики в WordPress по расписанию
14.02.2026
Как отключить отзывы WooCommerce для отдельных товаров
28.02.2026
Автоматическое удаление старого контента в WordPress
03.02.2026
Как избежать проблем с переходами по ссылкам в WordPress
07.02.2026