Диагностика проблемы: почему старые корзины и заказы замедляют WooCommerce
С течением времени в базе данных WooCommerce накапливаются устаревшие корзины и заказы с разными статусами (например, отменённые, проваленные или просто заброшенные корзины). Это увеличивает вес базы, замедляет запросы и негативно влияет на производительность сайта, особенно при большом трафике и большом количестве товаров.
Чтобы проверить, насколько сильно загружена база, выполните SQL-запросы:
SELECT COUNT(*) FROM wp_woocommerce_sessions; -- количество активных сессий корзин
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-pending'); -- количество старых заказов с указанными статусами
SELECT COUNT(*) FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'shop_order') AND meta_key = '_customer_ip_address'; -- пример проверки метаданных заказов
Если количество записей превышает десятки тысяч, это повод для очистки.
Пошаговое решение: автоматическое удаление старых корзин и заказов
1. Удаление старых сессий корзин WooCommerce
WooCommerce хранит данные корзин в таблице wp_woocommerce_sessions с привязкой по session_key и expiry. Автоматически сессии со временем удаляются, но не всегда эффективно.
Добавьте следующий код в functions.php вашей темы или в отдельный плагин для принудительной очистки старых сессий старше 7 дней:
function wpone_cleanup_old_woocommerce_sessions() {
global $wpdb;
$expiry_time = time() - 7 * DAY_IN_SECONDS; // 7 дней назад
$table = $wpdb->prefix . 'woocommerce_sessions';
$deleted = $wpdb->query(
$wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$expiry_time
)
);
if ( false !== $deleted ) {
error_log("[WooCommerce Cleanup] Deleted $deleted old sessions.");
}
}
add_action('wp_scheduled_cleanup', 'wpone_cleanup_old_woocommerce_sessions');
// Запускаем задачу раз в сутки
if ( ! wp_next_scheduled( 'wp_scheduled_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wp_scheduled_cleanup' );
}
2. Удаление старых заказов с определёнными статусами
Для удаления заказов со статусами cancelled, failed и pending, старше 30 дней, используйте WP_Query и функцию wp_delete_post():
function wpone_delete_old_shop_orders() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-failed', 'wc-pending'],
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'posts_per_page' => 100,
'fields' => 'ids',
];
$query = new WP_Query($args);
if ( $query->have_posts() ) {
foreach ( $query->posts as $order_id ) {
wp_delete_post( $order_id, true );
}
error_log('[WooCommerce Cleanup] Deleted ' . count($query->posts) . ' old orders.');
}
}
add_action('wp_scheduled_order_cleanup', 'wpone_delete_old_shop_orders');
// Запуск задачи раз в неделю
if ( ! wp_next_scheduled( 'wp_scheduled_order_cleanup' ) ) {
wp_schedule_event( time(), 'weekly', 'wp_scheduled_order_cleanup' );
}
Проверка результата после внедрения
- Повторите SQL-запросы из раздела диагностики. Количество записей в таблицах
wp_woocommerce_sessionsиwp_postsс указанными статусами должно значительно снизиться. - Проверьте логи сервера или debug.log на наличие сообщений от функций очистки.
- Оцените скорость загрузки страниц и время ответа базы данных до и после очистки.
Частые ошибки и как их исправить
- Ошибка: Задачи wp_cron не запускаются автоматически.
Причина: WP-Cron требует посещения сайта, на слабом трафике задачи не срабатывают.
Решение: Настройте системный cron на сервере для вызоваwp-cron.phpкаждые 15 минут. - Ошибка: Удаляются нужные заказы.
Причина: Неправильно указаны статусы или дата.
Решение: Проверьте аргументы WP_Query, используйте тестовый режим с логированием ID заказов перед удалением. - Ошибка: Переполнение таблицы
wp_woocommerce_sessionsнесмотря на очистку.
Причина: Плагины или кастомные решения создают сессии без ограничения срока.
Решение: Проверьте сторонние плагины, отключите или исправьте логику сессий.
Практические советы по безопасности и производительности
- Перед удалением данных сделайте резервную копию базы.
- Не удаляйте заказы со статусом
processingилиcompleted— это могут быть реальные продажи. - Очищайте базу пакетно, чтобы не перегружать сервер — например, по 100 записей за раз.
- Используйте WP-Cron или системный cron для регулярной автоматизации очистки.
- Проверьте индексы таблиц базы данных — наличие индексов по
session_expiryиpost_statusускорит операции удаления.
Сравнение вариантов очистки базы WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через phpMyAdmin | Мгновенный эффект, полный контроль | Риск удаления нужных данных, требует навыков SQL | Маленькие базы, единоразовая очистка |
| Автоматизированный скрипт на PHP с WP-Cron | Безопасно, автоматизация, пакетная обработка | Зависимость от Cron, требует настройки | Регулярная очистка на больших сайтах |
| Плагины для очистки WooCommerce (Clearfy Pro) | Удобный интерфейс, дополнительные опции | Может нагрузить сайт, платные функции | Пользователи без навыков кода, комплексное решение |