WooCommerce: автоматическое удаление неактивных заказов с помощью Cron и PHP

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

В интернет-магазинах на WooCommerce часто накапливаются заказы в статусах, таких как "ожидает оплаты" или "в обработке", которые не были завершены покупателями или администраторами. Это приводит к увеличению размера базы данных, замедлению работы сайта и неправильной отчетности.

Для диагностики проблемы необходимо проверить наличие таких заказов и оценить их количество и возраст. Например, можно выполнить следующий SQL-запрос через phpMyAdmin или WP-CLI:

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

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

Пошаговое решение: настройка Cron задачи и PHP скрипта

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

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

function wpzen_delete_old_inactive_orders() {
    // Определяем дату отсечки
    $date_before = date('Y-m-d H:i:s', strtotime('-30 days'));

    // Получаем заказы со статусами wc-pending и wc-on-hold старше 30 дней
    $args = [
        'limit' => -1,
        'status' => ['pending', 'on-hold'],
        'date_created' => '<' . $date_before,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Полное удаление заказа
    }
}

2. Регистрация Cron задачи в WordPress

Добавьте в functions.php следующий код для создания планировщика, который будет запускать функцию ежедневно:

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

add_action('wpzen_daily_delete_old_orders', 'wpzen_delete_old_inactive_orders');

3. Очистка Cron при деактивации темы или плагина

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

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

  • Подождите 24 часа после внедрения, чтобы Cron задача сработала.
  • Проверьте наличие удалённых заказов через админ-панель WooCommerce или SQL-запросом:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

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

Также можно временно поменять интервал удаления на несколько минут, чтобы проверить работу кода без ожидания суток, изменив 'daily' на 'hourly' и дату в strtotime().

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

  • Функция не запускается: убедитесь, что WP Cron вообще работает на сайте. Для диагностики используйте плагин WP Crontrol.
  • Удаляются не те заказы: проверьте статус заказов в массиве 'status' и дату отсечки, чтобы избежать удаления активных заказов.
  • Ошибка удаления заказов: если wp_delete_post() не удаляет заказ, проверьте права пользователя и наличие плагинов, блокирующих удаление.
  • Много заказов — высокая нагрузка при удалении: для больших магазинов рекомендуется делать удаление партиями, например, по 50 заказов за один запуск.

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

  • Создавайте резервные копии базы данных перед внедрением массового удаления.
  • Для крупных сайтов внедряйте пакетное удаление с сохранением логов удалённых заказов.
  • Ограничьте права на выполнение кода удаления только администраторам.
  • Если сайт имеет много трафика, рассмотрите запуск Cron задач через системный Cron на сервере для большей стабильности.

Сравнение вариантов реализации автоматического удаления заказов

МетодПреимуществаНедостатки
WP Cron + PHP код (описанный) Простота внедрения, гибкость настройки, полностью в рамках WordPress Зависимость от посещаемости сайта, возможна задержка с выполнением
Системный Cron + WP-CLI Точная регулярность, высокая надежность Требуется доступ к серверу и навыки работы с командной строкой
Плагины управления заказами Готовые решения с интерфейсом, дополнительные функции Нагрузка на сайт, риск конфликтов, возможные платные версии
Как создать автоматический импорт продуктов в WooCommerce с помощью WPZen
24.12.2025
WooCommerce: автоматическое удаление неактивных заказов с помощью Cron
11.05.2026
WooCommerce: автоматическое удаление заказов по статусу с помощью Cron
07.05.2026
WordPress: как создать настраиваемую опцию темы в админке с примером кода
12.01.2026
Как создать автоматические уведомления в WordPress с помощью WPRemark
08.04.2026