Диагностика проблемы: почему важно удалять забытые корзины и заказы
В WooCommerce забытые корзины и незавершённые заказы накапливаются со временем, что приводит к росту размеров базы данных и снижению производительности сайта. Кроме того, такие данные могут забивать административную панель и затруднять аналитику реальных заказов.
Чтобы проверить наличие забытых корзин, выполните SQL-запрос к базе данных:
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_value LIKE '%cart%';Для незавершённых заказов (статус "отменённый", "ожидание оплаты" более X дней):
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);Если число таких записей велико, пора автоматизировать их удаление.
Пошаговое решение: автоматическое удаление забытых корзин
Удаление старых сессий WooCommerce (корзин)
WooCommerce хранит данные корзин в таблице wp_woocommerce_sessions. Чтобы удалять сессии старше определённого срока (например, 7 дней), создадим WP-Cron задачу.
function delete_old_woocommerce_sessions() {
global $wpdb;
$interval = 7 * DAY_IN_SECONDS;
$time_limit = time() - $interval;
$sessions = $wpdb->get_results(
$wpdb->prepare(
"SELECT session_key, session_expiry FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
$time_limit
)
);
foreach ($sessions as $session) {
$wpdb->delete(
"{$wpdb->prefix}woocommerce_sessions",
['session_key' => $session->session_key]
);
}
}
// Планируем cron, если ещё не запланирован
add_action('wp', function() {
if (!wp_next_scheduled('delete_old_woocommerce_sessions_hook')) {
wp_schedule_event(time(), 'daily', 'delete_old_woocommerce_sessions_hook');
}
});
add_action('delete_old_woocommerce_sessions_hook', 'delete_old_woocommerce_sessions');Автоматическое удаление старых незавершённых заказов
Заказы в статусах wc-pending, wc-cancelled можно удалять через WP-Cron, если они старше 30 дней.
function delete_old_pending_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-pending', 'wc-cancelled'],
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}
// Планируем cron задачу
add_action('wp', function() {
if (!wp_next_scheduled('delete_old_pending_orders_hook')) {
wp_schedule_event(time(), 'daily', 'delete_old_pending_orders_hook');
}
});
add_action('delete_old_pending_orders_hook', 'delete_old_pending_orders');Проверка результата после внедрения
- Запустите вручную функции, если хотите проверить сразу:
delete_old_woocommerce_sessions();
delete_old_pending_orders();- Через phpMyAdmin или через консоль посмотрите количество записей в
wp_woocommerce_sessionsи постов типаshop_orderв соответствующих статусах. - Проверьте, что WP-Cron задачи запланированы командой WP CLI:
wp cron event list --fields=hook,next_run
Частые ошибки и как их исправить
- WP-Cron не срабатывает: Если на сайте низкий трафик, WP-Cron может не запускаться. Используйте системный cron или плагин WP Crontrol для проверки и запуска задач вручную.
- Удаление не работает из-за прав доступа: Убедитесь, что пользователь, под которым работает код, имеет права на удаление постов.
- Удаляются важные заказы: Проверьте корректность фильтра статусов и даты, чтобы не удалить активные или важные заказы.
- Дублирование задач в WP-Cron: Перед добавлением планирования проверьте, что задача ещё не запланирована, как показано в коде.
Практические советы по безопасности и производительности
- Запускайте удаление только по расписанию, избегайте выполнения при каждом запросе.
- Перед удалением сделайте резервную копию базы данных.
- Для крупных магазинов оптимизируйте выборку и удаление партиями, чтобы не превышать лимиты памяти и времени выполнения скриптов.
- Регулярно очищайте и оптимизируйте таблицы базы данных (например,
wp_woocommerce_sessions), используя оптимизационные плагины или SQL-запросы. - Используйте плагин Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wptest.ru&utm_medium=article&utm_campaign=woocommerce-kak-ustanovit-avtomaticheskoe-udaleniye-zabytyh-korziny-i-zakazov для дополнительной очистки и оптимизации WooCommerce.
Сравнение вариантов реализации удаления забытых корзин и заказов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Простота, безопасность | Трудозатратно, неэффективно при большом объёме | Использовать для мелких магазинов |
| WP-Cron с собственным кодом | Автоматизация, гибкость, нет сторонних зависимостей | WP-Cron зависит от посещаемости сайта, требует тестирования | Подключить системный cron для надёжности |
| Плагины для очистки и оптимизации | Простота настройки, дополнительные опции | Могут нагружать базу, иногда платные | Использовать вместе с кастомным кодом для максимальной эффективности |