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

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

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

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

Для начала нужно понять, какие заказы считать неактивными. Обычно это заказы, находящиеся в определённом статусе, например, pending (ожидает оплаты) или failed, и которые не обновлялись более определённого срока, например, 30 дней.

Проверить количество таких заказов можно SQL-запросом:

SELECT COUNT(*), post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 30 DAY;

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

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

1. Добавляем функцию удаления в functions.php или собственный плагин

function wpgenerate_delete_old_inactive_orders() {
    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . ( new WC_DateTime() )->modify('-30 days')->date('Y-m-d H:i:s'),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // можно заменить на wp_delete_post($order_id, true) для полного удаления
    }
}

2. Настраиваем WP-Cron для регулярного запуска

Регистрируем свое событие и создаем крон-задачу, которая будет запускаться, например, раз в неделю:

add_action('wpgenerate_weekly_cleanup', 'wpgenerate_delete_old_inactive_orders');

function wpgenerate_schedule_weekly_cleanup() {
    if (! wp_next_scheduled('wpgenerate_weekly_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpgenerate_weekly_cleanup');
    }
}
add_action('wp', 'wpgenerate_schedule_weekly_cleanup');

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

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

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

  • Посмотреть в админке WooCommerce количество заказов в статусах pending и failed старше 30 дней — они должны исчезнуть после первого запуска.
  • В логах сервера или с помощью плагина Query Monitor проверить, что функция запускается по расписанию.
  • При необходимости добавить логирование в функцию удаления (например, запись ID удалённых заказов в файл).

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

  • Ошибка: Заказы не удаляются, хотя они подходят под критерии.
    Причина: Неправильный статус заказа или дата.
    Решение: Убедитесь, что в массиве 'status' указаны правильные статусы с префиксом wc- (например, wc-pending). Для wc_get_orders можно использовать короткие статусы pending, но проверяйте на практике.
  • Ошибка: Функция не запускается автоматически.
    Причина: WP-Cron не настроен или не вызывается.
    Решение: Проверьте наличие заданий в wp-cron.php, настройте системный cron на вызов wp-cron.php для надежности.
  • Ошибка: Заказы удаляются полностью, а нужно в корзину.
    Решение: Используйте wp_trash_post($order_id) для перемещения в корзину, а wp_delete_post($order_id, true) для полного удаления без возможности восстановления.

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

  • Не удаляйте заказы полностью, если нужна история: перемещайте в корзину, чтобы сохранить данные для аналитики.
  • Добавьте проверку nonce и права пользователя, если функция запускается из интерфейса.
  • Ограничьте количество одновременно удаляемых заказов в одном цикле (например, 100 штук), чтобы не перегружать сервер.
  • Для магазинов с большой базой используйте WP CLI для запуска очистки вручную или по расписанию вне WP-Cron.
  • Ведите логирование удаления для возможности аудита.

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

МетодПлюсыМинусыКогда использовать
Текущий код с WP-Cron Автоматизация, простота внедрения, встроенные хуки WooCommerce Зависимость от WP-Cron, возможна нагрузка при большом количестве заказов Малые и средние магазины, где WP-Cron работает корректно
Удаление через WP CLI Высокая производительность, контроль вручную или через системный cron Требует доступа к серверу и командной строке Большие магазины, опытные администраторы
Плагины очистки базы Удобство, интерфейс, дополнительные функции Могут быть тяжелыми, лишние зависимости Если нет возможности писать код, нужна простота
Как автоматически удалять неактивные вариации товаров в WooCommerce с помощью кода
07.05.2026
Как удалить или изменить автора постов в WordPress без плагинов
06.12.2025
Как автоматически создавать контент на основе GPT в WordPress
07.01.2026
Как сделать автоматический импорт продуктов в WordPress с помощью WP All Import
30.03.2026
WooCommerce: автоматическое создание и удаление купонов по расписанию
08.07.2026