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

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

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

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

Прежде чем внедрять удаление, проверьте:

  • Объем таблиц wp_posts и wp_woocommerce_sessions: если они содержат тысячи заказов и сессий, это повод для очистки.
  • Время отклика сайта и админки — если заметны задержки при загрузке заказов.
  • Наличие брошенных корзин, которые не обновлялись более 30 дней.

Для оценки размеров таблиц используйте phpMyAdmin или запросы SQL:

SELECT table_name AS 'Table', ROUND(data_length/1024/1024, 2) AS 'Size (MB)' FROM information_schema.tables WHERE table_schema = 'your_database_name' AND table_name IN ('wp_posts', 'wp_woocommerce_sessions');

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

1. Автоматическое удаление заказов старше определенного срока

WooCommerce не удаляет заказы автоматически, для этого нужно добавить кастомный код в файл functions.php вашей темы или создать небольшой плагин.

function wpt_delete_old_orders() {
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }
    global $wpdb;
    $days = 90; // Удалять заказы старше 90 дней
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID заказов для удаления
    $order_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_date < %s",
        $date
    ) );

    if ( ! empty( $order_ids ) ) {
        foreach ( $order_ids as $order_id ) {
            wp_delete_post( $order_id, true ); // Полное удаление
        }
    }
}

// Запускаем очистку ежедневно при запуске wp-cron
add_action( 'wp_loaded', function() {
    if ( ! wp_next_scheduled( 'wpt_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpt_daily_order_cleanup' );
    }
});
add_action( 'wpt_daily_order_cleanup', 'wpt_delete_old_orders' );

2. Автоматическое удаление старых сессий и брошенных корзин

WooCommerce хранит данные корзин в таблице сессий. Для удаления устаревших сессий можно использовать следующий код:

function wpt_delete_old_woocommerce_sessions() {
    global $wpdb;
    $expiration = 30; // Дни неактивности
    $time_limit = time() - ( $expiration * DAY_IN_SECONDS );

    $table = $wpdb->prefix . 'woocommerce_sessions';
    $sessions = $wpdb->get_results( "SELECT session_id, session_expiry FROM $table" );

    foreach ( $sessions as $session ) {
        if ( $session->session_expiry < $time_limit ) {
            $wpdb->delete( $table, array( 'session_id' => $session->session_id ) );
        }
    }
}

add_action( 'wp_loaded', function() {
    if ( ! wp_next_scheduled( 'wpt_daily_session_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpt_daily_session_cleanup' );
    }
});
add_action( 'wpt_daily_session_cleanup', 'wpt_delete_old_woocommerce_sessions' );

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

  • Проверьте через phpMyAdmin, уменьшился ли объем таблиц wp_posts (shop_order) и wp_woocommerce_sessions.
  • Запустите задачу очистки вручную (выполните хук через WP-CLI или временно вызовите функцию) и убедитесь, что удаление работает.
  • В админке WooCommerce убедитесь, что заказы старше 90 дней отсутствуют.
  • Проверьте на фронтенде, что корзина у неактивных пользователей очищается.

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

  • Удаление заказов не происходит: Возможно, wp-cron не активен, проверьте работу WP Cron и настройте реальный cron-задачу на сервере.
  • Удаляются нужные заказы: Проверьте условие по дате, не установите слишком короткий срок.
  • Ошибки доступа: Функция current_user_can( 'manage_woocommerce' ) может блокировать запуск, протестируйте с правами администратора.
  • Сбои в удалении сессий: Убедитесь, что таблица wp_woocommerce_sessions существует и доступна базе данных.

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

  • Для удаления больших объемов данных используйте пакетную обработку, чтобы избежать таймаутов.
  • Настройте реальный системный cron вместо wp-cron для стабильной работы задач.
  • Перед удалением заказов сделайте резервную копию базы данных.
  • Если ваш магазин активно работает с архивными заказами, рассмотрите вариант архивирования данных вместо удаления.
  • Используйте плагины, например Clearfy Pro для комплексной оптимизации и удаления мусора.
WooCommerce: как отключить автоматический пересчет стоимости товаров в корзине
30.06.2026
Как создать собственный вид регистрации в WordPress с примерами кода и плагинов
25.11.2025
WooCommerce: как удалить товар из корзины без пересчета стоимости
17.06.2026
Автоматизация установки и настройки темы WordPress: пошаговое руководство
16.03.2026
WooCommerce: установка и настройка AJAX пагинации для каталога товаров
22.04.2026