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

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

В WooCommerce неоплаченные заказы (статус "pending" или "failed") накапливаются со временем и могут занимать место в базе данных, замедлять работу магазина и усложнять администрирование. Особенно актуально для магазинов с большим трафиком и множеством клиентов, где заказы остаются в подвешенном состоянии долгое время.

Нужно определить, как долго заказы считаются "старым" мусором. Обычно берут период от 1 до 7 дней в зависимости от политики магазина.

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

Для начала можно посмотреть количество неоплаченных заказов в админке WooCommerce, перейдя в WooCommerce → Заказы и применив фильтр по статусу Ожидает оплаты или Неудачный.

Также можно выполнить SQL-запрос для подсчёта таких заказов напрямую:

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

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

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

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

function wptips_delete_old_unpaid_orders() {
    $days = 3; // число дней, старше которых удалять заказы
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // перемещаем в корзину
        }
    }
}

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

Добавьте в functions.php создание и привязку задачи WP-Cron, которая будет запускать удаление раз в сутки:

// Регистрируем событие при активации темы/плагина
function wptips_schedule_order_cleanup() {
    if (!wp_next_scheduled('wptips_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wptips_daily_order_cleanup');
    }
}
add_action('wp', 'wptips_schedule_order_cleanup');

// Привязываем функцию удаления к событию
add_action('wptips_daily_order_cleanup', 'wptips_delete_old_unpaid_orders');

// Для отмены расписания (например, при деактивации плагина)
function wptips_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wptips_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wptips_daily_order_cleanup');
    }
}

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

1. Проверьте в базе данных или в админке количество неоплаченных заказов старше 3 дней — они должны быть удалены или перемещены в корзину.

2. Для теста можно вручную создать заказ с датой старше 3 дней и статусом pending, затем запустить функцию вручную:

wptips_delete_old_unpaid_orders();

3. Проверьте логи ошибок и убедитесь, что WP-Cron запускается (можно использовать плагин WP Crontrol для мониторинга).

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

  • Функция не удаляет заказы: проверьте правильность статусов и даты. WooCommerce использует статусы с префиксом wc-, но для wc_get_orders можно указывать без него.
  • WP-Cron не запускается: на некоторых хостингах нужно настроить системный cron или использовать плагин для имитации cron.
  • Удаляются не те заказы: внимательно проверьте фильтр по дате и статусу, чтобы не удалить оплаченные или важные заказы.
  • Заказы не удаляются полностью: функция wp_trash_post() перемещает в корзину, при необходимости можно заменить на wp_delete_post($order_id, true) для полного удаления.

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

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

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

МетодПлюсыМинусы
Ручное удаление через админкуПростой, без кодаТрудоемко, не автоматизировано
Код с WP-Cron (как в статье)Автоматизация, гибкостьТребует базовых навыков программирования
Плагины (Clearfy Pro и др.)Интерфейс, дополнительные функцииМожет быть платным, нагрузка на сайт
Как временно отключить WooCommerce без потери данных
21.05.2026
Как использовать WP-CLI для массовых изменений в WordPress
20.04.2026
Как использовать WP-Cron для задач с отложенным стартом в WordPress
19.12.2025
Как создать автоматический импорт визиток в WordPress с помощью REST API
30.03.2026
Удаление неиспользуемых медиафайлов в WordPress
04.11.2025