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

|

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

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

Неактивные корзины — это сессии пользователей, в которых есть товары, но не оформлен заказ. Неактивные заказы — заказы с статусом pending, failed или cancelled, которые не были оплачены и не закрываются автоматически.

Как определить неактивные корзины и заказы в WooCommerce

Для начала нужно понять, какие именно записи считать неактивными и подлежащими удалению:

Проверка количества неактивных заказов через SQL

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < NOW() - INTERVAL 7 DAY;

Этот запрос покажет, сколько заказов с указанными статусами старше 7 дней.

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

Реализуем функцию, которая будет запускаться по расписанию и удалять такие заказы и очищать корзины.

1. Добавляем хук для wp_cron

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

2. Функция удаления заказов старше 7 дней с нужными статусами

add_action('custom_clean_inactive_orders', function() {
    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); // удаляем навсегда
        }
    }

    // Очистка устаревших transient с корзинами
    $transients = $wpdb->get_col("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_wc_session_%'");
    $now = time();
    foreach ($transients as $transient) {
        $session_data = get_option($transient);
        if (isset($session_data['cart']) && isset($session_data['last_activity'])) {
            // Удаляем, если последний доступ был более 7 дней назад
            if ($session_data['last_activity'] < $now - 7 * 24 * 3600) {
                delete_option($transient);
            }
        }
    }
});

3. Как проверить работу

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

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

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

МетодПлюсыМинусыКомпромисс
Плагин (например, Clearfy Pro)Простота, интерфейс, регулярные обновленияЗависимость от стороннего кода, может быть тяжеловеснымИспользовать для небольших магазинов или без опыта кодинга
Код в functions.phpЛегковесность, контроль над логикой, кастомизацияНеобходимость тестирования, возможные ошибки при обновленияхПодходит для разработчиков, готовых поддерживать код
SQL-запросы напрямуюМаксимальная скорость, можно запускать вручнуюРиск повредить данные, требует осторожностиИспользовать для разовых очисток с резервной копией
Решение проблемы: WooCommerce не отправляет письма подтверждения заказов
26.04.2026
WooCommerce: как настроить отправку писем при массовом изменении статуса заказов
11.06.2026
Как автоматизировать удаление спама в комментариях WordPress
05.02.2026
Как создать многоуровневый фильтр продуктов в WordPress без плагинов
11.01.2026
Как добавить AJAX в формы WordPress без плагинов
15.12.2025
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее