Диагностика проблемы с удалением старых реш в WooCommerce
Магазины на WooCommerce со временем накапливают множество записей о решах (промежуточных данных, связанных с заказами и пользователями), которые перестали быть актуальными. Это приводит к разрастанию базы данных и замедлению работы сайта, особенно при большом количестве заказов. Встроенных средств для автоматического удаления старой реши WooCommerce нет, поэтому необходима дополнительная настройка с помощью WP-Cron.
Как понять, что накопилась старая реша?
- Замедленная работа административной панели WooCommerce;
- Увеличенный размер базы данных, особенно таблиц
_wc_session_tokensи_wc_customer_lookup; - Появление ошибок или задержек при обработке заказов;
- Ручная проверка через phpMyAdmin: большое количество записей старше 30-60 дней.
Пошаговое решение: автоматическое удаление старой реши через WP-Cron
1. Создание функции для удаления старых сессий и данных
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин. Код удаляет сессии пользователей старше 30 дней и промаркированные данные WooCommerce.
function wplog_delete_old_woocommerce_sessions() {
global $wpdb;
$days = 30; // количество дней для хранения сессий
$expiration = time() - ($days * DAY_IN_SECONDS);
// Удаляем старые сессии из таблицы _wc_session_tokens
$deleted_sessions = $wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->prefix}wc_session_tokens WHERE session_expiry < %d",
$expiration
)
);
// Удаляем старые метаданные сессий из _wc_session_tokens_meta (если есть)
// Обычно данные хранятся в _wc_session_tokens, дополнительная очистка по необходимости
return $deleted_sessions;
}2. Регистрация задачи в WP-Cron
Добавьте хук для запуска функции один раз в сутки.
function wplog_schedule_delete_old_sessions() {
if ( ! wp_next_scheduled( 'wplog_daily_delete_old_sessions' ) ) {
wp_schedule_event( time(), 'daily', 'wplog_daily_delete_old_sessions' );
}
}
add_action( 'wp', 'wplog_schedule_delete_old_sessions' );
add_action( 'wplog_daily_delete_old_sessions', 'wplog_delete_old_woocommerce_sessions' );3. Очистка заказов и черновиков с метаданными
Если требуется удалять не только сессии, но и заказы со статусом "отменён" или "завершён" старше определённого срока, можно расширить функцию:
function wplog_delete_old_orders() {
$days = 90;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = [
'status' => ['cancelled', 'completed'],
'date_modified' => '<' . $date_threshold,
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // true — без перемещения в корзину
}
return count( $orders );
}Зарегистрируйте отдельное событие для удаления заказов или включите вызов из основной функции.
Проверка результата после внедрения
- Проверьте таблицу
wp_wc_session_tokensчерез phpMyAdmin до и после запуска WP-Cron — количество записей должно уменьшиться. - Запустите вручную крон-событие через WP-CLI:
wp cron event run wplog_daily_delete_old_sessionsи проверьте результат. - Для удаления заказов проверьте список заказов в админке WooCommerce — старые отменённые и завершённые должны исчезнуть.
- Включите логирование в функции (например, через error_log) для отладки.
Частые ошибки и как их исправить
- Крон-событие не запускается: Убедитесь, что посещения сайта есть (WP-Cron зависит от них) или настройте системный cron на сервере.
- Ошибка прав доступа к базе данных: Проверьте настройки подключения к базе и права пользователя MySQL.
- Удаляются не те данные: Проверьте условия удаления и тестируйте на копии базы.
- Удаление заказов приводит к потере важных данных: Настройте фильтры и ограничения, чтобы удалять только действительно устаревшие и ненужные заказы.
Практические советы по безопасности и производительности
- Используйте транзакции или пакетное удаление, если объем данных большой, чтобы не блокировать базу.
- Не запускайте удаление слишком часто — достаточно раз в сутки.
- Сделайте резервную копию базы перед внедрением автоматического удаления.
- Для ускорения WP-Cron используйте системный cron и WP-CLI.
- Логируйте действия удаления для контроля и аудита.
Сравнение способов удаления старой реши WooCommerce
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP-Cron + код в functions.php | Гибкость, нет зависимостей | WP-Cron зависит от посещений сайта | Настроить системный cron для надежности |
| Плагины очистки базы (например, WP-Optimize) | Удобство, интерфейс | Могут удалять лишнее, нагрузка на сайт | Использовать с осторожностью, делать бэкапы |
| Ручное удаление через SQL | Точный контроль | Риск ошибок, требует знаний SQL | Использовать для разовых очисток |