WP-1

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

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

Незаконченные заказы (статус pending, failed, cancelled) часто накапливаются в WooCommerce, замусоривая базу и ухудшая производительность магазина. Особенно это актуально, если покупатели оставляют корзину без оформления или платеж проваливается. Без регулярной очистки таких заказов таблица wp_posts и связанные метаданные разрастаются, что замедляет запросы и увеличивает нагрузку на сервер.

Чтобы проверить, сколько таких заказов хранится, введите в базу данных MySQL:

SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') GROUP BY post_status;

Если число превышает несколько сотен, стоит настроить автоматическую очистку.

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

1. Добавляем пользовательскую функцию для удаления заказов

В файл functions.php вашей темы (или в плагин-сниппет) добавьте следующий код. Он удалит все заказы с указанными статусами, старше 7 дней.

function wc_delete_old_unfinished_orders() {
    global $wpdb;
    $statuses = [ 'wc-pending', 'wc-failed', 'wc-cancelled' ];
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( '-7 days' ) );

    foreach ( $statuses as $status ) {
        $orders = $wpdb->get_col( $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            $status,
            $date_threshold
        ) );

        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true ); // true - принудительное удаление
        }
    }
}

2. Создаем WP-Cron задачу для регулярного запуска

Добавьте регистрацию события и его запуск раз в сутки:

add_action( 'wc_delete_old_unfinished_orders_hook', 'wc_delete_old_unfinished_orders' );

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

3. Как отключить задачу при необходимости

$timestamp = wp_next_scheduled( 'wc_delete_old_unfinished_orders_hook' );
if ( $timestamp ) {
    wp_unschedule_event( $timestamp, 'wc_delete_old_unfinished_orders_hook' );
}

Проверка работы решения

  • Выполните запрос из раздела диагностики и запомните число незаконченных заказов.
  • Запустите функцию вручную в админке, например, через WP-CLI: wp eval 'wc_delete_old_unfinished_orders();'.
  • Повторите запрос в базе. Количество заказов с указанными статусами и старше 7 дней должно упасть до нуля.
  • Проверьте логи ошибок сервера и сайта на предмет сбоев при удалении.

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

  • Заказы не удаляются: проверьте, активна ли WP-Cron и не блокирует ли сайт выполнение задач. Для проверки можно использовать плагин WP Crontrol.
  • Удаляются нужные заказы: убедитесь, что статус указан правильно и дата пороговая не слишком большая. Например, не используйте дату, которая удалит свежие заказы.
  • Нагрузка на сервер при удалении: при большом объеме заказов удаление по одному может быть тяжёлым. Решение — разбивать удаление на батчи или запускать в off-peak часы.
  • Проблемы с правами: функция wp_delete_post требует прав администратора. Убедитесь, что код выполняется с нужными правами.

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

  • Используйте wp_delete_post с параметром true, чтобы полностью удалить заказ и связанные метаданные.
  • Регулярно проверяйте статус WP-Cron задач, чтобы они не накладывались и выполнялись стабильно.
  • Для больших баз данных рассмотрите использование WP-CLI скриптов для пакетной очистки с ограничением по времени выполнения.
  • Резервное копирование базы перед запуском автоматических удалений обязательно.

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

МетодОписаниеПлюсыМинусы
WP-Cron + PHP функция (как в статье)Автоматический запуск через планировщик WordPressАвтоматизация, простая настройкаЗависит от активности сайта, возможны задержки
WP-CLI скриптРучной запуск скрипта через командную строкуКонтроль запуска, быстрое выполнениеТребует доступа к серверу, не автоматизировано
Плагин очистки базыГотовые решения с настройками удаленияУдобство, дополнительные функцииМожет влиять на производительность, зависимость от стороннего кода
×
Прокачай свой сайт WordPress!

WordPress

-20% на премиум темы и плагины

Создай сайт своей мечты ⋙