WooCommerce: как автоматически очищать корзину и историю заказов по времени

Проблема: Переполнение корзины и истории заказов в WooCommerce

На больших магазинах WooCommerce накопление длительно незавершенных корзин и старых заказов замедляет работу базы данных и увеличивает нагрузку на сервер. Автоматическое удаление таких данных помогает поддерживать производительность и упрощает управление.

Диагностика текущей ситуации

Для начала проверьте, сколько записей в базе данных занимают корзины и заказы с помощью запросов MySQL или плагинов управления базой:

SELECT COUNT(*) FROM wp_woocommerce_sessions;
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order';

Если количество записей очень велико (десятки тысяч и выше), это повод оптимизировать.

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

Почему корзины накапливаются

WooCommerce хранит сессии корзины в таблице wp_woocommerce_sessions. По умолчанию они не очищаются автоматически, что приводит к росту размера таблицы.

Решение: Очистка корзин старше N дней через WP-Cron

Добавим в functions.php темы или в собственный плагин следующий код для очистки корзин старше 7 дней:

function wc_clear_old_sessions() {
    global $wpdb;
    $days = 7;
    $threshold = time() - ( $days * DAY_IN_SECONDS );
    $sessions = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT session_key, session_expiry FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
            $threshold
        )
    );
    foreach ( $sessions as $session ) {
        wc_delete_shop_session( $session->session_key );
    }
}

if ( ! wp_next_scheduled( 'wc_clear_old_sessions_cron' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_clear_old_sessions_cron' );
}
add_action( 'wc_clear_old_sessions_cron', 'wc_clear_old_sessions' );

Функция ищет все сессии с истекшим сроком и удаляет их. Запланированное событие запускается ежедневно.

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

Почему нужно удалять старые заказы

История заказов в WooCommerce хранится в wp_posts с типом shop_order и мета-данными в wp_postmeta. Старые, завершённые или отменённые заказы можно удалять, чтобы уменьшить размер базы.

Решение: Скрипт удаления заказов старше 30 дней

Пример кода для удаления заказов со статусом cancelled или failed, старше 30 дней:

function wc_delete_old_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '30 days ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => 100,
    );

    $orders = get_posts( $args );
    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

if ( ! wp_next_scheduled( 'wc_delete_old_orders_cron' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_delete_old_orders_cron' );
}
add_action( 'wc_delete_old_orders_cron', 'wc_delete_old_orders' );

Эта функция удаляет заказы с указанными статусами, старше 30 дней, по 100 штук за запуск (чтобы не перегружать сервер).

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

  • Проверьте размер таблицы wp_woocommerce_sessions до и после нескольких дней работы скрипта.
  • Проверьте количество заказов с нужными статусами в админке WooCommerce и через запросы SQL.
  • Убедитесь, что запланированные задачи WP-Cron работают: wp cron event list (через WP-CLI) или с помощью плагина WP Crontrol.

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

  • Функция не запускается: убедитесь, что на сайте активен WP-Cron, и нет отключения стандартных планировщиков.
  • Удаление не происходит: проверьте права пользователя и функции wp_delete_post; убедитесь, что нет ограничений хостинга на удаление.
  • Удаляются не те заказы: внимательно проверьте параметры post_status и дату в date_query.
  • Высокая нагрузка при удалении: уменьшите posts_per_page или увеличьте интервал запуска.

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

  • Перед внедрением сделайте полный бэкап базы данных.
  • Используйте WP-CLI для запуска очистки вручную и мониторинга.
  • Если на сайте много заказов, выполняйте очистку в ночное время, чтобы снизить влияние на пользователей.
  • Не удаляйте заказы с активными статусами processing или completed, чтобы не потерять данные о продажах.

Сравнение вариантов очистки корзины и заказов

МетодПлюсыМинусыПрименимость
WP-Cron + PHP кодГибкость, настраиваемые параметры, без сторонних плагиновЗависит от работы WP-Cron, требует навыков программированияДля разработчиков и кастомных проектов
Плагины очистки сессий и заказовПростота установки, готовые настройкиМогут замедлять сайт, не всегда подходят под специфические задачиДля администраторов без навыков кода
Ручные SQL запросыМаксимальная скорость и контрольРиск повреждения данных, требует опыта работы с базойЭкстренные случаи, опытные администраторы
Как установить ограничения на размер файлов в WordPress
30.01.2026
Как удалить неиспользуемые файлы в Media Library WordPress: практические методы и примеры
28.12.2025
Как добавить расширенные типы данных в WordPress
11.12.2025
Как создать уникальные отзывы с пользователем в WordPress
29.03.2026
Автоматическое удаление старых комментариев в WordPress
09.02.2026