Как правильно удалить незаконченые заказы WooCommerce через PHP

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

Незаконченые заказы (например, со статусом "отменен" или "ожидание оплаты") накапливаются в базе WooCommerce, что замедляет работу сайта и усложняет управление заказами. Часто владельцы магазинов не знают, как без плагинов автоматически и безопасно удалить такие заказы.

Проверьте, сколько заказов с нужным статусом хранится в базе, выполнив SQL-запрос в phpMyAdmin или через WP-CLI:

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

Если количество заказов велико (сотни и более), стоит настроить автоматическое удаление.

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

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

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

function wpacademy_delete_old_unfinished_orders() {
    // Статусы заказов для удаления
    $statuses = array('wc-cancelled', 'wc-failed', 'wc-pending');
    // Сколько дней хранить заказы
    $days_to_keep = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    foreach ($statuses as $status) {
        // Получаем заказы старше $days_to_keep дней
        $args = array(
            'post_type' => 'shop_order',
            'post_status' => $status,
            'date_query' => array(
                array(
                    'column' => 'post_date',
                    'before' => $date_threshold,
                ),
            ),
            'posts_per_page' => -1,
            'fields' => 'ids',
        );

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // true - безвозвратное удаление
            }
        }
    }
}

2. Настройка автоматического запуска через WP-Cron

Для регулярного удаления добавьте хуки в functions.php:

if (!wp_next_scheduled('wpacademy_delete_old_unfinished_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'wpacademy_delete_old_unfinished_orders_hook');
}
add_action('wpacademy_delete_old_unfinished_orders_hook', 'wpacademy_delete_old_unfinished_orders');

Этот код запустит удаление раз в сутки.

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

  • Выполните SQL-запрос из раздела диагностики до и после работы задачи, чтобы убедиться, что старые заказы удалены.
  • Посмотрите раздел заказов WooCommerce в админке — устаревшие незаконченые заказы должны пропасть.
  • Проверьте wp-cron: вызовите вручную через WP-CLI wp cron event run wpacademy_delete_old_unfinished_orders_hook.

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

  • Заказы не удаляются: возможно, WP-Cron не активен на сайте. Проверьте, что запускается wp-cron.php или настройте системный cron.
  • Удаляются не те заказы: проверьте правильность статусов в массиве $statuses — используйте именно системные статусы WooCommerce с префиксом wc-.
  • Удаление занимает слишком много времени: для больших баз лучше разбивать удаление на порции (posts_per_page с лимитом 50-100).
  • Потеря данных: будьте осторожны с параметром wp_delete_post($order_id, true) — true означает безвозвратное удаление. Для теста используйте false, чтобы переместить посты в корзину.

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

  • Перед внедрением создайте резервную копию базы данных.
  • Добавьте логирование удаленных заказов, чтобы отслеживать действия.
  • Для больших магазинов лучше реализовать удаление пакетами с ограничением по времени выполнения, чтобы избежать таймаутов PHP.
  • Отключите автоматический запуск на тестовом сервере, чтобы не удалять данные случайно.
  • Используйте плагин Clearfy Pro для дополнительной оптимизации WooCommerce и управления заказами, если нужны расширенные возможности.

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

МетодПлюсыМинусы
Удаление через PHP + WP-Cron (код)Полный контроль, бесплатно, без плагиновНужны навыки программирования, риски при ошибках
Плагины оптимизации WooCommerceУдобно, часто с GUI, поддержкаДополнительная нагрузка, платные функции
Ручное удаление через админкуПросто, быстро для единичных случаевНе подходит для регулярной очистки большого объема
Автоматическое удаление завершённых заказов WooCommerce через PHP
05.06.2026
Как добавить уникальные метаданные для страниц в WordPress без плагинов
21.02.2026
Автоматическое удаление вариантов товаров WooCommerce по условию
24.05.2026
Как исключить страницы из XML sitemap в WordPress без поломки индексации
19.08.2026
Как автоматизировать удаление неиспользуемых шорткодов в WordPress
31.03.2026