Диагностика проблемы: почему нужно удалять неактивные корзины и заказы
В интернет-магазинах на WooCommerce накапливаются заказы и корзины, которые не были завершены или неактивны длительное время. Это приводит к росту размера базы данных, замедлению работы сайта и усложнению аналитики. Часто такие заказы имеют статус pending или failed, а корзины представлены в мета-данных пользователей или сессиях.
Основная задача — автоматизировать очистку неактивных корзин и заказов, чтобы поддерживать базу в актуальном состоянии без ручного вмешательства.
Как определить неактивные корзины и заказы в WooCommerce
Критерии неактивности могут быть разными, но обычно подходят следующие:
- Заказы со статусом
pendingилиfailed, созданные более X дней назад. - Корзины (сессии) без активности более X часов.
Проверка статуса заказов
Заказы можно получить так (пример для 7 дней):
$args = [
'status' => ['pending', 'failed'],
'date_created' => '<' . ( new WC_DateTime( '-7 days' ) )->format('Y-m-d H:i:s'),
'limit' => -1,
];
$orders = wc_get_orders($args);Проверка неактивных корзин (сессий)
WooCommerce хранит сессии в базе в таблице wp_woocommerce_sessions. Можно получить все сессии старше нужного времени и удалить их.
Пошаговое решение: как программно удалять неактивные корзины и заказы
1. Удаление неактивных заказов
Добавим функцию, которая будет удалять заказы по статусу и дате создания:
function wc_remove_inactive_orders( $days = 7 ) {
$args = [
'status' => ['pending', 'failed'],
'date_created' => '<' . ( new WC_DateTime( "-{$days} days" ) )->format('Y-m-d H:i:s'),
'limit' => -1,
];
$orders = wc_get_orders($args);
foreach ( $orders as $order ) {
wp_delete_post( $order->get_id(), true );
}
}2. Удаление неактивных корзин (сессий)
Удаляем сессии старше 24 часов через прямой запрос к базе:
function wc_remove_expired_sessions( $hours = 24 ) {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$time_limit = time() - ( $hours * 3600 );
$wpdb->query( $wpdb->prepare( "DELETE FROM $table WHERE session_expiry < %d", $time_limit ) );
}3. Автоматизация с помощью WP-Cron
Добавим регулярное задание, чтобы очистка происходила автоматически:
add_action('wc_cron_cleanup', function() {
wc_remove_inactive_orders(7);
wc_remove_expired_sessions(24);
});
if ( ! wp_next_scheduled('wc_cron_cleanup') ) {
wp_schedule_event(time(), 'daily', 'wc_cron_cleanup');
}Как проверить, что удаление сработало
- Через админку WooCommerce: количество заказов со статусом
pendingиfailedдолжно уменьшиться после запуска. - В базе данных таблица
wp_woocommerce_sessionsдолжна очищаться от записей сsession_expiryстарше 24 часов. - Логи WP-Cron (плагин WP Crontrol или аналог) покажут, что задача запускалась.
Частые ошибки и как их исправить
- Заказы не удаляются
Проверьте, что функцияwp_delete_postвызывается с параметромtrueдля полного удаления, а не в корзину. - Очистка сессий не работает
Проверьте таблицуwp_woocommerce_sessionsи права пользователя базы данных. Иногда таблица может иметь другой префикс. - WP-Cron не запускается
Убедитесь, что посетители заходят на сайт (WP-Cron запускается при загрузке страниц) или настройте системный cron для вызоваwp-cron.php.
Практические советы по безопасности и производительности
- Перед удалением заказов сделайте резервную копию базы данных.
- Для больших сайтов с тысячами заказов можно разбивать удаление на части, например, по 100 заказов за запуск, чтобы снизить нагрузку.
- Очистку сессий выполняйте не чаще одного раза в сутки, чтобы не создавать лишних запросов к базе.
- При необходимости расширьте фильтры: например, учитывайте дополнительные статусы или время неактивности.
Сравнение вариантов автоматической очистки
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WP Optimize) | Простота настройки, дополнительные функции оптимизации | Может быть избыточным, нагрузка на сайт, не всегда гибкие настройки |
| Собственный код с WP-Cron | Точный контроль, легковесность, адаптация под требования | Требует навыков разработки, ответственность за ошибки |
| Ручное удаление через админку | Простота, безопасность | Трудозатратно, не автоматизировано |