Диагностика проблемы: зачем удалять старые корзины в WooCommerce
В WooCommerce корзина покупателя хранится в сессии и куках, но при использовании некоторых плагинов и кастомных решений корзины могут накапливаться в базе данных, например, в виде заказов со статусом "корзина" (pending, failed, или кастомных). Это приводит к увеличению размера базы и замедлению запросов, особенно на крупных магазинах с большим трафиком.
Если вы заметили, что таблица wp_posts содержит много заказов со статусом, которые не переходят в следующий этап, или база весит слишком много, пора настроить автоматическое удаление старых корзин.
Как определить, что корзины накапливаются
- Запрос в базе по статусам заказов:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed'); - Если количество заказов с этими статусами растет, а время их создания превышает 7 дней — корзины не очищаются.
- Проверить настройки плагинов кеша и сессий, которые могут хранить корзины в базе.
Пошаговое решение: как автоматически удалять старые корзины
1. Создаем функцию очистки старых заказов с определенным статусом
function wpt_delete_old_cart_orders() {
global $wpdb;
$days = 7; // Время хранения корзины в днях
$statuses = ['wc-pending', 'wc-failed']; // Статусы заказов-корзин
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов старше даты
$old_orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN (%s, %s) AND post_date < %s",
$statuses[0], $statuses[1], $date_threshold
));
if (!empty($old_orders)) {
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true); // Принудительное удаление
}
}
}2. Добавляем крон-задачу для регулярного запуска
Чтобы функция выполнялась автоматически, регистрируем событие WP-Cron:
if (!wp_next_scheduled('wpt_daily_cart_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpt_daily_cart_cleanup');
}
add_action('wpt_daily_cart_cleanup', 'wpt_delete_old_cart_orders');3. Очистка при деактивации плагина или темы
function wpt_deactivate_cleanup() {
wp_clear_scheduled_hook('wpt_daily_cart_cleanup');
}
register_deactivation_hook(__FILE__, 'wpt_deactivate_cleanup');Проверка результата после внедрения
- Запустите функцию вручную, вызвав
wpt_delete_old_cart_orders();через консоль WP CLI или временно в functions.php. - Запросите количество заказов с нужными статусами до и после выполнения:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');После запуска количество должно уменьшиться, если были старые корзины.
Через сутки проверьте, сработал ли WP-Cron – можно использовать плагин WP Crontrol или проверить логи сервера.
Частые ошибки и как исправить
- Неправильные статусы заказов. WooCommerce может использовать кастомные статусы или сторонние плагины меняют логику. Проверьте, какие статусы соответствуют "корзине".
- WP-Cron не запускается. При низкой посещаемости сайта WP-Cron может не срабатывать. Рекомендуется настроить системный cron или проверить вызовы через
wp_cron(). - Удаление заказов приводит к ошибкам в отчетах. Если вы используете расширенную аналитику, подумайте об архивировании данных перед удалением.
- Удаление заказов не работает. Проверьте права пользователя и доступ к базе данных, также убедитесь, что функция вызывается.
Практические советы по безопасности и производительности
- Удаляйте только заказы с явно определёнными статусами и старше 7 дней — чтобы не потерять актуальные данные.
- Используйте
wp_delete_postс параметромtrueдля полного удаления, включая метаданные. - Для крупных магазинов запускайте функцию в off-peak время или разбивайте удаление на части, чтобы не перегружать БД.
- Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wptemplates.ru&utm_medium=article&utm_campaign=woocommerce-avto-udaleniye-starogo-korziny) для оптимизации базы и удаления временных данных.
Сравнение способов удаления старых корзин
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP-Cron с кастомной функцией | Гибкость, полное удаление | Зависит от посещаемости сайта | Настроить системный cron для запуска WP-Cron |
| Плагины очистки базы | Простота установки, UI для управления | Могут удалять лишние данные, не всегда точны | Использовать проверенные плагины с резервным копированием |
| Ручное удаление SQL-запросами | Быстро и без нагрузки на WP | Риск ошибок, потеря данных без восстановления | Выполнять только опытным администраторам с бэкапом |