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

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

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

Типичные признаки проблемы:

  • В панели WooCommerce отображается большое количество неоплаченных заказов.
  • Производительность админки падает при открытии раздела заказов.
  • Резервные копии базы данных становятся слишком большими.

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

1. Использование WP-Cron для планирования задачи

Для регулярного удаления заказов используем WP-Cron и кастомную функцию. Пример кода, который удаляет неоплаченные заказы старше 7 дней:

<?php
// Хук для регистрации собственного события в WP-Cron
add_action('wp_loaded', function() {
    if (!wp_next_scheduled('wc_auto_delete_unpaid_orders')) {
        wp_schedule_event(time(), 'daily', 'wc_auto_delete_unpaid_orders');
    }
});

// Хук для выполнения удаления
add_action('wc_auto_delete_unpaid_orders', function() {
    $days = 7; // Срок в днях
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'status' => ['pending', 'failed', 'on-hold'],
        'date_created' => '<' . $date,
        'limit' => -1
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $order->delete(true); // true для полного удаления
    }
});

// Очистка расписания при деактивации плагина или темы
register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wc_auto_delete_unpaid_orders');
});
?>

2. Внедрение кода в сайт

Рекомендуется добавить код в кастомный плагин или в functions.php дочерней темы. Это позволит избежать потери изменений при обновлении.

3. Настройка интервала и статусов

Можно изменить интервал запуска (например, на ежечасный) или добавить/убрать статусы заказов, которые нужно удалять, изменив параметры в массиве 'status' и вызове wp_schedule_event.

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

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

  • Создайте тестовый заказ с одним из статусов: "pending", "failed" или "on-hold".
  • Установите время создания заказа более 7 дней назад (можно через базу данных, изменив поле date_created в таблице wp_posts по ID заказа).
  • Запустите вручную крон-событие через плагин WP Crontrol или вызовом функции do_action('wc_auto_delete_unpaid_orders');.
  • Проверьте, что заказ удалился из админки WooCommerce.

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

  • Крон-событие не запускается: Проверьте, активен ли WP-Cron на сайте. Если сайт малопосещаемый, WP-Cron может не срабатывать. В этом случае настройте системный cron на сервере и отключите WP-Cron (через define('DISABLE_WP_CRON', true); в wp-config.php).
  • Удаление не происходит: Убедитесь, что у вас есть права на удаление заказов, и функция wc_get_orders возвращает заказы с нужными параметрами. Проверьте правильность статусов и даты в запросе.
  • Заказы удаляются, но не полностью: Используйте метод $order->delete(true); с параметром true для полного удаления, включая метаданные.
  • Удаление удаляет нужные заказы: Проверьте условия фильтрации по дате и статусу, чтобы не потерять важные данные.

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

  • Перед внедрением сделайте резервную копию базы данных.
  • Не ставьте слишком короткий интервал удаления, чтобы избежать конфликтов с актуальными заказами.
  • Оптимизируйте запросы, если заказов очень много - обрабатывайте порциями.
  • Логи для контроля можно добавить, записывая ID удалённых заказов в отдельный файл или таблицу.

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

МетодПлюсыМинусыРекомендации
Плагин (например, WP Rocket, Clearfy Pro)Простота, готовые настройки, поддержкаЗависимость от сторонних решений, нагрузкаИспользовать, если нужен комплексный подход к оптимизации
Код в functions.php или плагинеТочный контроль, легковесность, кастомизацияТребует навыков, риск ошибокЛучше для опытных разработчиков, при специфичных задачах
Ручное удаление через базу данныхМаксимальная гибкостьРиск потери данных, требует знаний SQLНе рекомендуется без полной уверенности
⭐⭐⭐⭐⭐