Диагностика проблемы: почему база 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 | Используйте с резервной копией |
| Плагины очистки | Простота использования, интерфейс | Могут замедлять сайт, лишний код | Подходят для новичков, но с осторожностью |