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

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

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

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

1. Создаём функцию удаления отменённых заказов

Для начала напишем функцию на PHP, которая будет искать все заказы со статусом cancelled и удалять их из базы.

function wpmy_delete_cancelled_orders() {
    // Получаем заказы со статусом cancelled
    $orders = wc_get_orders(array(
        'limit' => -1,
        'status' => 'cancelled',
        'return' => 'ids'
    ));

    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — без возможности восстановления
    }
}

2. Регистрируем WP-Cron событие для регулярного запуска

Далее добавим задачу в планировщик WordPress для запуска функции, например, раз в сутки.

// Хук для запуска функции
add_action('wpmy_daily_cancelled_order_cleanup', 'wpmy_delete_cancelled_orders');

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

// Очистка при деактивации
function wpmy_clear_scheduled_cleanup() {
    $timestamp = wp_next_scheduled('wpmy_daily_cancelled_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpmy_daily_cancelled_order_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpmy_clear_scheduled_cleanup');

3. Альтернативный вариант: запуск через системный cron

Если WP-Cron ненадёжен на хостинге, можно создать системную задачу на сервере, которая будет вызывать wp-cron.php:

wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Это обеспечит регулярный запуск запланированных задач, включая нашу очистку.

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

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

  • Создайте вручную несколько заказов с статусом "Отменён" (cancelled).
  • Запустите функцию удаления вручную через админ-панель или WP CLI:
    wp eval 'wpmy_delete_cancelled_orders();'
  • Проверьте, что эти заказы исчезли из базы (в админке WooCommerce или через запрос SQL).
  • Дождитесь автоматического срабатывания WP-Cron и проверьте, что новые отменённые заказы также удаляются.

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

  • Заказы не удаляются: убедитесь, что функция зарегистрирована правильно и событие WP-Cron запускается. Проверьте наличие заданий через плагин WP Crontrol.
  • Удаляются не все заказы: функция wc_get_orders может возвращать частями, если слишком много заказов. Убедитесь, что 'limit' => -1 указан и ограничений по памяти нет.
  • WP-Cron не работает: на некоторых хостингах WP-Cron отключён или работает нестабильно. Используйте системный cron для вызова wp-cron.php.
  • Удаление приводит к ошибкам: проверьте, что вызывается wp_delete_post с параметром true для полного удаления. Также убедитесь, что нет конфликтующих плагинов, блокирующих удаление.

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

  • Для безопасности запускайте WP-Cron через HTTPS с проверкой IP, если используете системный cron.
  • Регулярно делайте резервные копии базы перед массовым удалением данных.
  • Если магазин очень большой, рассмотрите пакетную обработку заказов с лимитом по количеству за раз, чтобы избежать таймаута.
  • Используйте плагин WP Crontrol для мониторинга и управления вашими cron-задачами.

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

МетодПлюсыМинусыРекомендации
WP-Cron с PHP функциейПолный контроль, не требует сторонних плагиновЗависит от посещаемости сайта, может не сработать вовремяДля малых и средних магазинов
Системный cron на сервереНадёжно, запускается по расписаниюТребует доступа к серверу и настройкиДля больших магазинов и серьёзных проектов
Плагины очистки заказовПростота установки, GUIМогут быть избыточными, нагрузка на сайтЕсли не хочется писать код
Как создать свой плагин WordPress с нуля: пошаговое руководство
08.11.2025
Как отключить AJAX в WooCommerce для разных страниц сайта
24.04.2026
WooCommerce: автоматическое обновление статуса заказа после отправки
21.06.2026
Как отключить комментарии на отдельных страницах WordPress
10.04.2026
WooCommerce: как автоматически удалять зависшие отменённые заказы
30.05.2026