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

Проблема: накопление неоплаченных заказов в WooCommerce

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

Диагностика: как понять, что заказы нужно удалять

Прежде чем автоматизировать удаление, нужно понять, какие именно заказы считаются «неоплаченными» и как долго их хранить:

  • Статусы заказов: обычно это pending (ожидает оплаты), failed или on-hold;
  • Возраст заказа: например, старше 7 или 14 дней;
  • Отсутствие оплаты: нет транзакций или факта оплаты.

Проверить количество таких заказов можно через 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 7 DAY);

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

Добавим в файл functions.php или в собственный плагин код, который будет раз в сутки удалять заказы с нужным статусом и старше заданного времени.

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

function wpmagazin_delete_old_unpaid_orders() {
    $days = 7; // Удалять заказы старше 7 дней
    $statuses = array('wc-pending', 'wc-on-hold');

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'column'    => 'post_date',
                'before'    => "$days days ago",
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление
        }
    }
}

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

Добавим ежедневное событие, если его еще нет:

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

add_action('wpmagazin_daily_order_cleanup', 'wpmagazin_delete_old_unpaid_orders');

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

  • Через базу данных проверьте количество заказов с статусом wc-pending и датой старше 7 дней — их должно стать меньше или они должны исчезнуть после первого запуска.
  • Проверьте логи сервера на наличие ошибок при запуске WP-Cron.
  • Для теста можно временно уменьшить период удаления с 7 дней до 1 дня и добавить тестовый заказ.

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

  • WP-Cron не срабатывает: если сайт мало посещаемый, WP-Cron может не запускаться. Решение — настроить реальный системный cron на вызов wp-cron.php.
  • Заказы не удаляются: убедитесь, что статусы в массиве совпадают с реальными статусами в базе (с префиксом wc-).
  • Удаляются нужные заказы: внимательно проверьте условие по дате и статусам, не задавайте слишком широкий диапазон.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, чтобы не оставлять мусор в базе.
  • Для большого числа заказов добавьте пагинацию в запрос и удаляйте партиями, чтобы не перегружать сервер.
  • Перед удалением можно сохранять резервную копию базы или экспортировать заказы через WooCommerce.
  • Ограничьте права на выполнение этого кода только администратору, если запускаете вручную.

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

МетодПлюсыМинусыКомментарий
Плагин (например, WooCommerce Cleanup)Простота установки, интерфейс настройкиМожет грузить сайт, лишний функционалПодходит для непрофессионалов
Собственный код с WP-CronКонтроль, легковесность, настройка под себяТребует знаний, возможны ошибки в логикеРекомендуется разработчикам
Ручное удаление через SQLМгновенный эффектРиск потерять данные, сложностьОпасно без опыта
Как удалить или изменить атрибуты товара в WooCommerce через код
20.04.2026
Как установить и настроить WooCommerce на WordPress
01.12.2025
Как создать собственный виджет в WordPress с примером кода
28.12.2025
Как создать автоматические резервные копии WordPress без плохой нагрузки на сервер
17.03.2026
Как удалить ненужные виджеты в WordPress через функции темы
13.04.2026