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

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

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

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

Скопление неоплаченных заказов можно заметить по следующим признакам:

  • В админке WooCommerce в разделе «Заказы» много записей со статусом pending или on-hold, которые не меняются месяцами;
  • При запросах к базе данных таблица wp_posts с типом shop_order содержит большое количество таких записей;
  • Отчеты по продажам показывают неактуальные данные из-за старых неоплаченных заказов.

Чтобы проверить число неоплаченных заказов через SQL, выполните:

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

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

Ниже приведён пример кода, который можно добавить в файл functions.php вашей темы или в кастомный плагин. Он будет запускаться ежедневно через WP-Cron и удалять заказы, которые находятся в статусах pending или on-hold дольше заданного количества дней.

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

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            'before' => $date_threshold,
        ),
        '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); // true — удаляет без перемещения в корзину
        }
    }
}

add_action('wpsolution_daily_delete_unpaid_orders', 'wpsolution_delete_old_unpaid_orders');

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

Как отключить задачу при необходимости

function wpsolution_clear_cron() {
    $timestamp = wp_next_scheduled('wpsolution_daily_delete_unpaid_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpsolution_daily_delete_unpaid_orders');
    }
}
// Вызовите wpsolution_clear_cron() при деактивации плагина или темы

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

Чтобы убедиться, что удаление работает корректно:

  • Создайте тестовый заказ со статусом pending, которому более 7 дней (можно временно изменить дату в базе для теста);
  • Запустите вручную событие WP-Cron через плагин типа WP Crontrol или вызовите функцию wpsolution_delete_old_unpaid_orders() вручную;
  • Проверьте, что заказ исчез из списка заказов в админке и из базы;
  • Проверьте логи ошибок сервера на предмет проблем с удалением.

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

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

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

  • Всегда делайте резервные копии базы перед внедрением автоматического удаления данных.
  • Проверяйте логи сервера после запуска задачи, чтобы выявить возможные ошибки.
  • Если заказов очень много, разбивайте удаление на порции, чтобы не перегружать сервер. Пример:
function wpsolution_delete_old_unpaid_orders_chunked() {
    $days = 7;
    $statuses = array('wc-pending', 'wc-on-hold');
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            'before' => $date_threshold,
        ),
        'posts_per_page' => 20, // удалять по 20 заказов за раз
        'fields'         => 'ids',
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true);
        }
    }
}
  • Для повышения безопасности используйте capability проверки, если функцию вызываете из админки.
  • Рассмотрите плагин Clearfy Pro — он помогает оптимизировать базу и может дополнительно очистить лишние данные.
Как удалить или изменить выставку данных в WordPress без поддержки плагинов
19.12.2025
Как удалить оверхэнджер в WordPress без плагинов
12.12.2025
WooCommerce: как автоматически удалять заказы после их отмены
22.07.2026
Как использовать REST API в WordPress для создания панели настроек
17.11.2025
Как отключить автоматические обновления WordPress
03.01.2026