Проблема: Переполнение корзины и истории заказов в WooCommerce
На больших магазинах WooCommerce накопление длительно незавершенных корзин и старых заказов замедляет работу базы данных и увеличивает нагрузку на сервер. Автоматическое удаление таких данных помогает поддерживать производительность и упрощает управление.
Диагностика текущей ситуации
Для начала проверьте, сколько записей в базе данных занимают корзины и заказы с помощью запросов MySQL или плагинов управления базой:
SELECT COUNT(*) FROM wp_woocommerce_sessions;
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order';Если количество записей очень велико (десятки тысяч и выше), это повод оптимизировать.
Автоматическое удаление старых корзин WooCommerce
Почему корзины накапливаются
WooCommerce хранит сессии корзины в таблице wp_woocommerce_sessions. По умолчанию они не очищаются автоматически, что приводит к росту размера таблицы.
Решение: Очистка корзин старше N дней через WP-Cron
Добавим в functions.php темы или в собственный плагин следующий код для очистки корзин старше 7 дней:
function wc_clear_old_sessions() {
global $wpdb;
$days = 7;
$threshold = time() - ( $days * DAY_IN_SECONDS );
$sessions = $wpdb->get_results(
$wpdb->prepare(
"SELECT session_key, session_expiry FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
$threshold
)
);
foreach ( $sessions as $session ) {
wc_delete_shop_session( $session->session_key );
}
}
if ( ! wp_next_scheduled( 'wc_clear_old_sessions_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wc_clear_old_sessions_cron' );
}
add_action( 'wc_clear_old_sessions_cron', 'wc_clear_old_sessions' );Функция ищет все сессии с истекшим сроком и удаляет их. Запланированное событие запускается ежедневно.
Автоматическое удаление старых заказов WooCommerce
Почему нужно удалять старые заказы
История заказов в WooCommerce хранится в wp_posts с типом shop_order и мета-данными в wp_postmeta. Старые, завершённые или отменённые заказы можно удалять, чтобы уменьшить размер базы.
Решение: Скрипт удаления заказов старше 30 дней
Пример кода для удаления заказов со статусом cancelled или failed, старше 30 дней:
function wc_delete_old_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-cancelled', 'wc-failed'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '30 days ago',
),
),
'fields' => 'ids',
'posts_per_page' => 100,
);
$orders = get_posts( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
if ( ! wp_next_scheduled( 'wc_delete_old_orders_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_old_orders_cron' );
}
add_action( 'wc_delete_old_orders_cron', 'wc_delete_old_orders' );Эта функция удаляет заказы с указанными статусами, старше 30 дней, по 100 штук за запуск (чтобы не перегружать сервер).
Проверка результата после внедрения
- Проверьте размер таблицы
wp_woocommerce_sessionsдо и после нескольких дней работы скрипта. - Проверьте количество заказов с нужными статусами в админке WooCommerce и через запросы SQL.
- Убедитесь, что запланированные задачи WP-Cron работают:
wp cron event list(через WP-CLI) или с помощью плагина WP Crontrol.
Частые ошибки и как их исправить
- Функция не запускается: убедитесь, что на сайте активен WP-Cron, и нет отключения стандартных планировщиков.
- Удаление не происходит: проверьте права пользователя и функции
wp_delete_post; убедитесь, что нет ограничений хостинга на удаление. - Удаляются не те заказы: внимательно проверьте параметры
post_statusи дату вdate_query. - Высокая нагрузка при удалении: уменьшите
posts_per_pageили увеличьте интервал запуска.
Практические советы по безопасности и производительности
- Перед внедрением сделайте полный бэкап базы данных.
- Используйте WP-CLI для запуска очистки вручную и мониторинга.
- Если на сайте много заказов, выполняйте очистку в ночное время, чтобы снизить влияние на пользователей.
- Не удаляйте заказы с активными статусами
processingилиcompleted, чтобы не потерять данные о продажах.
Сравнение вариантов очистки корзины и заказов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| WP-Cron + PHP код | Гибкость, настраиваемые параметры, без сторонних плагинов | Зависит от работы WP-Cron, требует навыков программирования | Для разработчиков и кастомных проектов |
| Плагины очистки сессий и заказов | Простота установки, готовые настройки | Могут замедлять сайт, не всегда подходят под специфические задачи | Для администраторов без навыков кода |
| Ручные SQL запросы | Максимальная скорость и контроль | Риск повреждения данных, требует опыта работы с базой | Экстренные случаи, опытные администраторы |