Диагностика проблемы: почему важно удалять неактивные корзины и заказы
В интернет-магазинах на WooCommerce накопление неактивных корзин и заказов приводит к разрастанию базы данных, замедлению работы сайта и усложнению аналитики. Неактивные корзины — это сессии пользователей, которые не завершили покупку, а неактивные заказы — неоплаченные или заброшенные, которые занимают место и могут влиять на отчёты.
Первым шагом проверьте, насколько велика проблема. Для этого зайдите в базу данных через phpMyAdmin и выполните запросы:
SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP();
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND DATEDIFF(NOW(), post_date) > 7;Если количество таких записей велико (сотни и более), пора автоматизировать их удаление.
Пошаговое решение: удаление неактивных корзин
Удаление устаревших сессий WooCommerce
WooCommerce хранит данные корзин в таблице wp_woocommerce_sessions. Чтобы очистить устаревшие сессии, можно использовать WP-Cron задачу, которая раз в сутки удаляет сессии с истёкшим временем.
function wptem_delete_expired_woocommerce_sessions() {
global $wpdb;
$table = $wpdb->prefix . 'woocommerce_sessions';
$time = time();
$deleted = $wpdb->query( $wpdb->prepare(
"DELETE FROM $table WHERE session_expiry < %d",
$time
));
if ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log("Deleted $deleted expired WooCommerce sessions.");
}
}
if ( ! wp_next_scheduled( 'wptem_daily_delete_expired_sessions' ) ) {
wp_schedule_event( time(), 'daily', 'wptem_daily_delete_expired_sessions' );
}
add_action( 'wptem_daily_delete_expired_sessions', 'wptem_delete_expired_woocommerce_sessions' );Этот код добавьте в файл functions.php вашей дочерней темы или в отдельный плагин. Он будет ежедневно очищать таблицу от старых сессий.
Удаление неактивных заказов WooCommerce
Для заказов с статусом wc-pending или wc-failed, которые не обновлялись более 7 дней, можно использовать подобный cron:
function wptem_delete_old_inactive_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '7 days ago'
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
if ( defined('WP_DEBUG') && WP_DEBUG ) {
error_log('Deleted ' . count($orders) . ' old inactive WooCommerce orders.');
}
}
if ( ! wp_next_scheduled( 'wptem_daily_delete_inactive_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wptem_daily_delete_inactive_orders' );
}
add_action( 'wptem_daily_delete_inactive_orders', 'wptem_delete_old_inactive_orders' );Проверка результата после внедрения
После активации кода проверьте логи ошибок (если включён WP_DEBUG) — там должно быть сообщение с количеством удалённых записей. Также вручную выполните запросы из раздела диагностики, чтобы убедиться, что количество неактивных корзин и заказов уменьшилось.
Для отладки можно вызвать функции вручную через консоль WP-CLI:
wp eval 'wptem_delete_expired_woocommerce_sessions();'
wp eval 'wptem_delete_old_inactive_orders();'Частые ошибки и как их исправить
- Код не выполняется: проверьте, что WP-Cron активен и нет конфликтов с другими плагинами, которые могут блокировать задачи.
- Удаляются нужные заказы: убедитесь, что в запросе фильтруются только статусы
wc-pendingиwc-failed, а также правильный период (>7 дней). - Ошибка в SQL-запросе: используйте
$wpdb->prepare()для безопасной подстановки параметров. - Отсутствие логов: включите
define('WP_DEBUG', true);иdefine('WP_DEBUG_LOG', true);вwp-config.phpдля отладки.
Практические советы по безопасности и производительности
- Добавляйте проверки прав пользователя, если планируете запускать очистку вручную через админку.
- Не увеличивайте частоту cron-заданий выше одного раза в сутки, чтобы не перегружать базу.
- Регулярно делайте бэкапы базы, особенно перед внедрением автоматического удаления данных.
- Для крупных магазинов с тысячами заказов лучше использовать пакетную обработку — удалять по частям с помощью пагинации.
Сравнение вариантов автоматического удаления неактивных корзин и заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + собственный код | Гибкость настройки, без сторонних плагинов | Требует базовых знаний PHP, зависит от WP-Cron | Код из статьи |
| Плагины очистки WooCommerce (например, WooCommerce Cleanup) | Простой интерфейс, настройки через админку | Могут иметь лишний функционал, нагрузка на сайт | Clearfy Pro — подходит для комплексной оптимизации |
| Ручное удаление через SQL | Быстро и эффективно | Риск ошибочных удалений, требует доступа к базе | SQL-запросы из раздела диагностики |