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

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

Магазины на WooCommerce часто сталкиваются с проблемой накопления большого количества отменённых и незаконченных заказов (статусы cancelled и failed). Это увеличивает размер базы данных, замедляет запросы и усложняет отчёты.

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

SELECT post_status, COUNT(*) AS total_orders FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

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

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

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

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

function wpd_auto_delete_old_orders() {
    $statuses_to_delete = array('wc-cancelled', 'wc-failed');
    $days_threshold = 30; // Удалять заказы старше 30 дней

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'post_type' => 'shop_order',
            'post_status' => $status,
            'date_query' => array(
                'before' => date('Y-m-d', strtotime("-{$days_threshold} days"))
            ),
            '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

Чтобы функция запускалась регулярно, добавим задачу в расписание WordPress:

if (!wp_next_scheduled('wpd_daily_delete_orders')) {
    wp_schedule_event(time(), 'daily', 'wpd_daily_delete_orders');
}
add_action('wpd_daily_delete_orders', 'wpd_auto_delete_old_orders');

3. Очистка расписания при деактивации

Если вы реализуете это в плагине, добавьте деактивационный хук для удаления крон-задачи:

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

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

Для проверки выполните следующие шаги:

  • Вручную запустите функцию wpd_auto_delete_old_orders() из консоли WP-CLI или временно вызовите её в админке.
  • Повторите SQL-запрос из блока диагностики и убедитесь, что количество заказов со статусами cancelled и failed сократилось.
  • Проверьте логи сервера и WooCommerce на предмет ошибок удаления.

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

  • Отсутствие прав на удаление заказов: Убедитесь, что используемый пользователь базы данных имеет права на удаление записей.
  • WP-Cron не работает: Проверьте, что на хостинге включён WP-Cron или настройте реальный cron-задание для запуска wp-cron.php.
  • Удаление не происходит из-за кеширования: Очистите кеш сайта и кеш объектов, если используете Redis или Memcached.
  • Функция не удаляет все нужные заказы: Проверьте дату создания заказа и формат статусов — WooCommerce использует префикс wc- в статусах.

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

  • Удаление заказов с помощью wp_delete_post() вызывает все необходимые хуки WooCommerce, что безопасно для целостности данных.
  • Не удаляйте заказы с активными платежами — убедитесь, что статусы корректно отражают отменённые или неудачные заказы.
  • Ограничьте количество заказов для удаления за один проход, если база очень большая, чтобы избежать таймаутов сервера. Например, добавьте параметр 'posts_per_page' => 100 и повторяйте вызов по крону.
  • Регулярно делайте резервные копии базы данных, особенно перед внедрением автоматического удаления.

Сравнение способов удаления заказов в WooCommerce

МетодПлюсыМинусы
Ручное удаление через админкуПростота, контрольМного времени, не подходит для большого объёма
SQL-запросы напрямую в базуБыстрое удалениеРиск повредить данные, не вызывает хуки
Автоматизация через WP-Cron и wp_delete_post()Безопасно, вызывает хуки, автоматизацияТребует настройки, может нагружать сервер при большом объёме
Плагины очистки WooCommerceПростота настройкиМогут быть платными, не всегда гибкие
Как автоматизировать управление ролями и правами в WordPress
13.02.2026
Как избежать проблем с кэшированием в WooCommerce: практическое руководство
03.06.2026
Как создать собственный шорткод в WordPress
08.11.2025
Автоматическое удаление отменённых и завершённых заказов WooCommerce по времени
10.06.2026
Как удалить или отключить комментарии на отдельных страницах WordPress
16.07.2026