WooCommerce: как эффективно очистить базу от старых корзин и заказов

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

Со временем в базе WooCommerce накапливаются старые заказы и корзины, особенно если не настроена автоматическая очистка. Это ведёт к увеличению размера базы, замедлению запросов и может вызвать проблемы с производительностью сайта. Важно определить, насколько серьёзна проблема:

  • Проверьте количество заказов в таблице wp_posts с типом shop_order:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order';
  • Определите, сколько заказов в статусах cancelled, failed, pending, которые можно удалить или архивировать:
    SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;
  • Проверьте таблицу wp_woocommerce_sessions, где хранятся сессии (корзины) пользователей. Большое количество записей здесь свидетельствует о накоплении старых корзин.

Когда старые корзины и заказы становятся проблемой

Если в вашей базе более 100 000 заказов, а также тысячи сессий старше 30 дней — это сигнал к очистке. Особенно в случае, если сайт работает на общем хостинге или с ограниченными ресурсами.

Пошаговое решение: как очистить старые корзины и заказы в WooCommerce

1. Очистка старых сессий пользователей (корзин)

По умолчанию WooCommerce хранит сессии в таблице wp_woocommerce_sessions. Можно удалить сессии старше определённого времени, например 30 дней:

global $wpdb;

$days = 30;
$expiration = time() - ( $days * DAY_IN_SECONDS );

$deleted = $wpdb->query(
    $wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
        $expiration
    )
);

echo "Удалено сессий: " . $deleted;

Добавьте этот код в файл functions.php темы или в отдельный плагин для однократного запуска. После выполнения удалите или закомментируйте код.

2. Удаление старых заказов по статусу и дате

Для удаления заказов используйте WP-CLI или напрямую запросы к базе. Ниже пример использования WP-CLI для удаления заказов со статусом cancelled и возрастом более 90 дней:

wp post delete $(wp post list --post_type=shop_order --post_status=cancelled --date_query_column=post_date --date_query_before='90 days ago' --format=ids) --force

Если WP-CLI недоступен, можно сделать запрос к базе для удаления заказов и связанных мета-данных:

global $wpdb;

$days = 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_status = 'wc-cancelled' AND post_date < %s",
    $date
));

if ( !empty($order_ids) ) {
    foreach ( $order_ids as $order_id ) {
        // Удаляем мета
        $wpdb->delete( "{$wpdb->prefix}postmeta", [ 'post_id' => $order_id ] );
        // Удаляем заказ
        $wpdb->delete( "{$wpdb->prefix}posts", [ 'ID' => $order_id ] );
    }
    echo "Удалено заказов: " . count($order_ids);
} else {
    echo "Заказы не найдены для удаления.";
}

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

  • Повторите запросы из раздела диагностики и убедитесь, что количество сессий и заказов уменьшилось.
  • Проверьте размер таблиц wp_woocommerce_sessions и wp_posts.
  • Проверьте работу сайта и скорость загрузки страниц оформления заказа и страниц заказов.

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

  • Удаление заказов без удаления мета-данных: приводит к мусору в базе. Решение — удалять посты и связанные мета через postmeta.
  • Удаление заказов с неправильным статусом: убедитесь, что статус в запросе указан корректно, например wc-cancelled, а не просто cancelled.
  • Повреждение данных из-за прерванных операций удаления: используйте транзакции или WP-CLI для безопасного удаления.
  • Кэширование мешает видеть изменения: очистите кэш сайта и браузера.

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

  • Перед массовым удалением создайте резервную копию базы данных.
  • Используйте WP-CLI для больших сайтов — это быстрее и безопаснее.
  • Регулярно очищайте старые сессии, настроив WP-Cron с приведённым выше скриптом.
  • Ограничьте хранение заказов с неактивными статусами по времени (например, удалять заказы старше 6 месяцев).
  • Мониторьте размер таблиц базы и производительность SQL-запросов.

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

МетодПреимуществаНедостаткиКомпромисс
WP-CLIБыстро, безопасно, массовое удалениеТребуется доступ к серверу и консолиЛучше для больших сайтов и регулярных задач
Ручной SQL-запросГибкость, не требует плагиновРиск ошибки, требует знаний SQLИспользуйте с резервной копией
Плагины очисткиПростота использования, интерфейсМогут замедлять сайт, лишний кодПодходят для новичков, но с осторожностью
Как избежать проблем с переадресацией в WordPress: практическое руководство
06.12.2025
WooCommerce: как проверить и исправить ошибку неправильного отображения стоимости в корзине
28.05.2026
Как запретить доступ к административной панели WordPress для определённых пользователей
21.03.2026
WooCommerce: как изменить стоимость товара после оплаты и использовать это в учёте
15.06.2026
Как использовать AJAX в формах WordPress без плагинов
29.01.2026