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

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

На крупных WooCommerce-магазинах часто накапливается множество неоплаченных заказов. Это не только загромождает базу данных, но и может влиять на отчёты и производительность сайта. Уточните, что именно вы считаете неоплаченным заказом — обычно это заказы со статусом pending или failed, которые не были оплачены в течение определённого времени.

Для диагностики выполните следующий SQL-запрос в базе данных (через phpMyAdmin или любой клиент MySQL), чтобы увидеть количество таких заказов и их возраст:

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

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

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

1. Определяем срок удаления

Часто используют срок 7 дней для неоплаченных заказов. Можно задать его в секундах:

define('ORDER_EXPIRATION_SECONDS', 7 * 24 * 60 * 60); // 7 дней

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

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

function wc_delete_expired_unpaid_orders() {
    $expiration = time() - ORDER_EXPIRATION_SECONDS;

    // Получаем заказы в статусах pending и failed, старше срока
    $args = array(
        'limit' => -1,
        'status' => array('pending', 'failed'),
        'date_created' => '<' . gmdate('Y-m-d H:i:s', $expiration),
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Перемещаем в корзину
            // Для полного удаления вместо wp_trash_post используйте wp_delete_post($order_id, true);
        }
    }
}

// Запускаем ежедневно
add_action('woocommerce_cleanup_expired_orders', 'wc_delete_expired_unpaid_orders');

// Регистрируем cron задачу при активации
function wc_schedule_cleanup_cron() {
    if (!wp_next_scheduled('woocommerce_cleanup_expired_orders')) {
        wp_schedule_event(time(), 'daily', 'woocommerce_cleanup_expired_orders');
    }
}
add_action('wp', 'wc_schedule_cleanup_cron');

3. Удаление заказов из корзины (очистка)

Заказы, перемещённые в корзину, не удаляются сразу. Можно добавить очистку корзины раз в 2 недели:

function wc_empty_trash_orders() {
    global $wpdb;
    $trash_status = 'trash';
    $older_than = gmdate('Y-m-d H:i:s', strtotime('-14 days'));

    $orders_in_trash = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_modified < %s",
        $trash_status, $older_than
    ));

    if (!empty($orders_in_trash)) {
        foreach ($orders_in_trash as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление
        }
    }
}
add_action('woocommerce_cleanup_expired_orders', 'wc_empty_trash_orders');

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

Для проверки:

  1. Создайте тестовый заказ в статусе pending.
  2. Измените дату создания заказа в базе данных на дату старше 7 дней (например, вручную через phpMyAdmin).
  3. Запустите крон-задачу вручную: используйте плагин WP Crontrol или вызов функции через админку.
  4. Проверьте, что заказ переместился в корзину, а спустя 14 дней полностью удалился.

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

  • Крон-задача не запускается — проверьте, активирован ли WP-Cron, или настройте системный cron на сервере.
  • Заказы не удаляются — убедитесь, что статусы заказов указаны корректно: WooCommerce добавляет префикс wc- к статусам, например, wc-pending, но в wc_get_orders надо использовать без префикса.
  • Удаление заказов приводит к потере данных — сначала используйте wp_trash_post(), чтобы убедиться, что вы не удаляете нужные заказы безвозвратно.
  • Проблемы с правами — убедитесь, что пользователь, под которым запускается WordPress, имеет права на удаление постов.

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

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

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

МетодОписаниеПлюсыМинусы
Ручное удаление через админку WooCommerceУдаление заказов вручную по фильтрамПростота, контрольТрудозатратно, не подходит для большого количества
Автоматический код в functions.php (cron)Удаление заказов по срокам с помощью кода и cronАвтоматизация, гибкость, без плагиновНеобходимость контроля и корректной настройки cron
Специализированные плагиныПлагины для очистки заказов (например, WP Bulk Delete)Удобный интерфейс, функционал настройкиНагрузка, возможные конфликты, зависит от поддержки плагина
Удаление метаданных из фото в WordPress: как защитить сайт и ускорить загрузку
04.01.2026
Как создать безопасную форму логина в WordPress: защита от атак и примеры кода
03.12.2025
Как удалить неиспользуемые метаданные товаров WooCommerce с помощью кода
26.05.2026
Контроль использования ресурсов WordPress: оптимизация и безопасность
30.03.2026
Как отключить плагины на определённых страницах WordPress
06.02.2026