WooCommerce: автоматическое удаление неподтверждённых заказов с использованием WP-Cron

Почему важно удалять неподтверждённые заказы в WooCommerce

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

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

В WooCommerce неподтверждённые заказы обычно имеют статус pending или failed. Чтобы проверить их количество, можно выполнить SQL-запрос к базе данных или использовать WP-CLI:

wp post list --post_type=shop_order --post_status=pending --format=count

Или через PHP-функцию:

$count = wc_orders_count( 'pending' );
echo "Неподтверждённых заказов: " . $count;

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

1. Создаём функцию для удаления неподтверждённых заказов старше X часов

function wpma_delete_old_pending_orders() {
    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'failed'),
        'date_created' => '<' . ( time() - 60 * 60 * 24 ), // заказы старше 24 часов
    );

    $orders = wc_get_orders($args);

    foreach ( $orders as $order ) {
        $order->delete( true ); // true — удалить навсегда
    }
}

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

add_action( 'wpma_daily_pending_orders_cleanup', 'wpma_delete_old_pending_orders' );

function wpma_schedule_pending_orders_cleanup() {
    if ( ! wp_next_scheduled( 'wpma_daily_pending_orders_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpma_daily_pending_orders_cleanup' );
    }
}
add_action( 'wp', 'wpma_schedule_pending_orders_cleanup' );

3. Проверяем и удаляем запланированные события при деактивации темы или плагина

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

Как проверить, что удаление работает корректно

  • Создайте тестовый заказ в статусе pending старше 24 часов (можно вручную изменить дату в базе или создать заказ и подождать).
  • Запустите вручную событие WP-Cron через плагин WP Crontrol или выполнив в консоли WP-CLI: wp cron event run wpma_daily_pending_orders_cleanup.
  • Проверьте, что заказ удалён из списка заказов WooCommerce.
  • Просмотрите логи ошибок PHP для отсутствия ошибок выполнения функции.

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

  • Заказы не удаляются: Возможно, событие WP-Cron не запускается. Проверьте работу WP-Cron на сайте, включите имитацию реального cron с помощью системного cron и команды wget или через плагин WP Crontrol.
  • Удаляются не те заказы: Убедитесь, что фильтр date_created указан правильно, и статус заказа соответствует pending или failed.
  • Ошибка доступа к функциям WooCommerce: Убедитесь, что код подключён в правильном месте — после загрузки WooCommerce (например, в functions.php темы или в плагине).

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

  • Удаление заказов всегда выполняйте с подтверждением, что заказ действительно не нужен. Не удаляйте заказы со статусом processing или completed.
  • Для больших магазинов с тысячами заказов лучше делать удаление частями, чтобы не перегружать сервер. Можно добавить параметр limit и запускать WP-Cron несколько раз в день.
  • Используйте транзакции и логи для отслеживания удалённых заказов, если это критично.
  • WP-Cron зависит от посещаемости сайта, для стабильности настройки используйте системный cron (Linux cron) для запуска WP-Cron команд.

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

ВариантПлюсыМинусыКогда использовать
WP-Cron с кастомной функциейГибкость, контроль, нет сторонних плагиновЗависит от посещаемости сайтаСредние и крупные магазины с возможностью доработки кода
Плагин автоматического удаления заказовПростота настройки, поддержкаДополнительная нагрузка, ограниченные настройкиМаленькие магазины без разработчиков
Системный cron + WP-CLIНадёжность, не зависит от посещаемостиНужен доступ к серверу, навыки администрированияБольшие проекты с серверным доступом
WooCommerce: автоматическое удаление неподтверждённых заказов
21.06.2026
Оптимизация WordPress для мобильных устройств: практические советы и примеры
30.11.2025
Как автоматически удалить неиспользуемые шорткоды в WordPress
15.03.2026
Как избежать проблем с бесконечным переадресом в WordPress
19.02.2026
Как автоматизировать удаление неиспользуемых медиафайлов в WordPress
15.01.2026