Диагностика проблемы: почему корзина и старые заказы накапливаются
Многие владельцы WooCommerce сталкиваются с проблемой переполнения базы данных старыми заказами и заброшенными корзинами. Это замедляет работу сайта и усложняет администрирование. По умолчанию WooCommerce не удаляет автоматически заброшенные корзины, а заказы остаются в базе бессрочно, что влияет на размер таблиц wp_woocommerce_sessions и wp_posts (заказы хранятся как записи с типом shop_order).
Накопление старых данных приводит к ухудшению производительности при запросах, особенно на крупных сайтах с тысячами заказов.
Как очистить корзину WooCommerce программно
Корзина в WooCommerce хранится в сессиях пользователей. Чтобы очистить корзину для конкретного пользователя или всех сессий, нужен код, который удалит записи из таблицы wp_woocommerce_sessions или сбросит корзину в текущей сессии.
Очистка корзины для текущего пользователя
function wc_clear_current_cart() {
if ( WC()->cart ) {
WC()->cart->empty_cart();
}
}
add_action('init', 'wc_clear_current_cart');Этот код очищает корзину текущего пользователя при вызове. Для массовой очистки нужно работать с сессиями в БД.
Удаление всех заброшенных корзин из базы
Корзины хранятся в wp_woocommerce_sessions с ключами сессий. Можно удалить записи старше определенного времени, например 7 дней:
function wc_delete_old_sessions() {
global $wpdb;
$expiration = time() - WEEK_IN_SECONDS;
$table = $wpdb->prefix . 'woocommerce_sessions';
$wpdb->query( $wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$expiration
) );
}
add_action('wp_loaded', 'wc_delete_old_sessions');Этот код удалит все сессии, срок действия которых истек, тем самым очистив заброшенные корзины.
Автоматическое удаление старых заказов WooCommerce
По умолчанию WooCommerce хранит все заказы, что со временем приводит к разрастанию БД. Чтобы удалять заказы старше X дней, используйте WP-CLI или пишите функцию для удаления через cron.
Пример функции для удаления заказов старше 180 дней
function wc_delete_old_orders() {
$days = 180;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-completed', 'wc-cancelled', 'wc-failed'],
'date_query' => [
[
'column' => 'post_date',
'before' => $date,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_orders = get_posts($args);
if ($old_orders) {
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true); // true - без перемещения в корзину
}
}
}
// Добавляем в WP-Cron для еженедельного удаления
if (!wp_next_scheduled('wc_delete_old_orders_event')) {
wp_schedule_event(time(), 'weekly', 'wc_delete_old_orders_event');
}
add_action('wc_delete_old_orders_event', 'wc_delete_old_orders');Проверка результата после внедрения
- Для очистки корзины: откройте сайт в режиме инкогнито, положите товар в корзину, затем вызовите функцию очистки и обновите страницу — корзина должна быть пустой.
- Для удаления старых сессий: проверьте таблицу
wp_woocommerce_sessionsв базе данных — записи со старымиsession_expiryдолжны исчезнуть. - Для удаления заказов: убедитесь, что заказы старше 180 дней отсутствуют в разделе WooCommerce -> Заказы.
Частые ошибки и как их исправить
- Ошибка: Функция очистки корзины не срабатывает для текущего пользователя.
Причина: Код вызывается до инициализации WC()->cart.
Решение: Поместите вызов в хукwp_loadedили позже. - Ошибка: WP-Cron не срабатывает.
Причина: Отсутствие посещений сайта или отключенный WP-Cron.
Решение: Используйте системный cron или запускайте WP-Cron вручнуюwp cron event run --due-now. - Ошибка: Не удаляются заказы с определённым статусом.
Причина: Статус заказа не входит в список в запросе.
Решение: Добавьте нужные статусы в массивpost_status.
Практические советы по безопасности и производительности
- Удаляйте заказы только после резервного копирования, чтобы не потерять важные данные.
- Проводите удаление старых заказов в WP-Cron, чтобы не перегружать сервер.
- Для больших магазинов используйте запросы с пагинацией, чтобы не превышать лимит памяти.
- Для очистки сессий можно использовать готовые плагины кеширования с поддержкой WooCommerce, например, Clearfy Pro (https://wpshop.ru/plugins/clearfy?source=wpcoder.ru&medium=article&campaign=woocommerce-ochistka-korziny-i-avtomaticheskoe-udaleniye-starogo-zakaza) — они облегчают управление кешем и сессиями.
Чек-лист по очистке корзин и заказов в WooCommerce
- Проверьте количество записей в таблице
wp_woocommerce_sessions. - Добавьте код очистки сессий и протестируйте на тестовом сайте.
- Настройте функцию удаления старых заказов с нужным периодом хранения.
- Запланируйте WP-Cron для регулярного запуска очистки.
- Проверьте журнал ошибок и логи сервера на наличие проблем.
- Обязательно создайте резервные копии перед массовыми удалениями.