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

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

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

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

Как проверить наличие проблемы

  • В админке WooCommerce перейдите в раздел Заказы.
  • Отфильтруйте заказы по статусу pending или failed.
  • Проверьте даты создания заказов: если есть неоплаченные заказы старше нужного срока (например, 7 дней), значит автоматическое удаление не настроено.
  • Для оценки нагрузки запросом к базе можно выполнить SQL-запрос:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 7 DAY;

Если количество заказов велико, это подтверждает необходимость автоматизации очистки.

Пошаговое решение: удаление неоплаченных заказов через WP-Cron

1. Написание функции удаления

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

function wpteam_delete_expired_unpaid_orders() {
    $days = 7; // количество дней после которого заказы считаются устаревшими
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    $args = [
        'post_type' => 'shop_order',
        'post_status' => ['wc-pending', 'wc-failed'],
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];
    
    $orders = get_posts($args);
    
    if (empty($orders)) {
        return;
    }
    
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление без корзины
    }
}

2. Регистрация WP-Cron задачи

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

if (!wp_next_scheduled('wpteam_delete_unpaid_orders_event')) {
    wp_schedule_event(time(), 'daily', 'wpteam_delete_unpaid_orders_event');
}

add_action('wpteam_delete_unpaid_orders_event', 'wpteam_delete_expired_unpaid_orders');

3. Отмена задачи при деактивации

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

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

  • Проверьте, что после запуска cron-задачи (можно вызвать вручную через WP-CLI или временно заменить 'daily' на 'hourly') в разделе заказов исчезают заказы старше 7 дней с статусом "ожидает оплаты" и "неудачный".
  • Для проверки можно использовать WP-CLI команду:
wp post list --post_type=shop_order --post_status=wc-pending --field=ID --date_query_before='7 days ago'

Если после выполнения cron-задачи таких заказов нет, значит скрипт работает корректно.

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

1. Скрипт не запускается по расписанию

  • Проверьте, что WP-Cron включен и работает.
  • Убедитесь, что нет конфликтов с плагинами, отключающими WP-Cron.
  • Можно настроить системный cron на вызов wp-cron.php для надежности.

2. Заказы не удаляются

  • Проверьте права пользователя, под которым выполняется WP-Cron (должен иметь права на удаление заказов).
  • Проверьте, не мешают ли хуки или плагины отменять удаление.
  • Для отладки добавьте логирование:
function wpteam_delete_expired_unpaid_orders() {
    // ...
    foreach ($orders as $order_id) {
        if (wp_delete_post($order_id, true)) {
            error_log("Order {$order_id} deleted");
        } else {
            error_log("Failed to delete order {$order_id}");
        }
    }
}

3. Удаление не тех заказов

  • Проверьте параметры post_status и date_query в запросе.
  • Проверьте, что дата учитывается в правильном часовом поясе.

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

  • Для больших магазинов избегайте удаления большого числа заказов за один запуск — можно разбить на порции с помощью posts_per_page и пагинации.
  • Перед удалением сделайте резервную копию базы данных.
  • Если заказы важны для отчетности, рассмотрите архивирование вместо удаления.
  • Реализуйте логирование удаления в отдельный файл для аудита.
  • Используйте WP-CLI для принудительного запуска и тестирования скрипта без ожидания cron.

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

СпособПлюсыМинусы
Плагин очистки заказов (например, WooCommerce Cleanup)Простота установки, настройка через UIМожет нагружать сайт, ограниченные настройки
Код с WP-Cron (как в статье)Гибкость, контроль, минимально нагружает серверТребует навыков программирования, нужно отлаживать
Ручное удаление через SQLБыстро, подходит для разовых задачРиск ошибки, нет автоматизации

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.