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

Почему важно удалять незаконченные заказы в WooCommerce

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

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

Для начала необходимо определить, какие именно заказы считаются незакончеными. Обычно это заказы со статусом pending, failed или cancelled, которые не были оплачены и не обновлялись долгое время.

Чтобы проверить количество таких заказов, выполните следующий SQL-запрос (через phpMyAdmin или WP CLI):

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

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

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

1. Создаем функцию для удаления старых заказов

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

function wpco_delete_old_unfinished_orders() {
    global $wpdb;
    $days = 7; // Количество дней, по истечении которых заказ считается устаревшим
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов устаревших статусов и даты создания старше порога
    $old_orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'shop_order' 
         AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') 
         AND post_date < %s",
         $date_threshold
    ));

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // true — принудительное удаление без перемещения в корзину
        }
    }
}

2. Запускаем функцию по расписанию через WP-Cron

Зарегистрируем планировщик, который будет запускать функцию раз в сутки:

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

add_action('wpco_daily_order_cleanup', 'wpco_delete_old_unfinished_orders');

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

Чтобы избежать дублирования задач и ошибок, добавьте деактивационный хук в плагин или файл функций:

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

Как проверить, что автоматическое удаление работает

  • Создайте тестовый заказ со статусом pending и датой создания старше 7 дней (можно вручную через базу данных или изменить дату в админке).
  • Запустите Cron вручную через WP-CLI: wp cron event run wpco_daily_order_cleanup.
  • Проверьте, что заказ удалился из админки WooCommerce и базы данных.
  • Для отладки можно добавить логирование в функцию удаления.

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает корректно. Если на сайте мало трафика, Cron может не запускаться вовремя — используйте системные cron-задачи для запуска WP-Cron.
  • Удаляются нужные заказы: Убедитесь, что в условии фильтрации заданы только нужные статусы и дата корректна.
  • Накладные операции на базе данных: Если заказов очень много, разбивайте удаление на чанки, чтобы избежать таймаута.

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

  • Всегда делайте резервное копирование перед автоматическим удалением данных.
  • Используйте транзакции или пакетное удаление через WP_Query с аргументом posts_per_page и пагинацией при большом количестве заказов.
  • Для сайтов с большим объемом заказов лучше запускать скрипт через системный cron, вызывающий WP-CLI, а не полагаться на WP-Cron.
  • Логируйте удаленные ID заказов для последующего аудита.

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

СпособПлюсыМинусы
WP-Cron с кастомной функциейПростота внедрения, не требует плагиновЗависит от трафика, возможны задержки
Системный cron + WP-CLIНадежность запуска, подходит для больших сайтовТребует доступа к серверу и дополнительных настроек
Плагины очистки заказовУдобный интерфейс, дополнительные функцииМожет нагружать сайт, зависимость от стороннего кода
Как использовать REST API для создания кастомных эндпойнтов в WordPress
08.12.2025
Как установить ограничения на размер файлов в WordPress
30.01.2026
Как сделать автоматический импорт данных из Google Sheets в WordPress
24.02.2026
WooCommerce: как автоматически удалять заказы старше 30 дней
09.06.2026
WooCommerce: как автоматически удалять товары по истечении срока действия
16.05.2026