Как автоматически удалять незакрытые сеансы пользователей в WordPress

Диагностика проблемы незакрытых сеансов в WordPress

В WordPress сеансы пользователей (sessions) позволяют сохранять авторизацию и состояние между посещениями сайта. Однако иногда возникает ситуация, когда сеансы остаются активными слишком долго, например, если пользователь не вышел из аккаунта или браузер был закрыт некорректно. Это может привести к накоплению большого количества устаревших сессий в базе данных, замедлению работы сайта, а также увеличению риска безопасности.

Типичные признаки проблемы:

  • Слишком большое число записей в таблице wp_usermeta с ключом session_tokens или в других таблицах, связанных с сессиями.
  • Пользователи жалуются, что остаются авторизованными слишком долго.
  • Общее замедление работы сайта из-за большого объема метаданных сессий.

Как работает управление сессиями в WordPress

WordPress использует класс WP_Session_Tokens для управления сессиями пользователей. Каждый пользователь может иметь несколько активных сессий (например, с разных устройств). Сессии хранятся в базе данных и автоматически истекают по времени, заданному в фильтре auth_cookie_expiration.

По умолчанию срок действия куки авторизации — 14 дней, после чего сессия считается устаревшей и должна удаляться.

Пошаговое решение: автоматическое удаление устаревших сессий пользователей

1. Настройка срока жизни сессии

Для начала рекомендуем уменьшить срок жизни сессии для повышения безопасности и уменьшения нагрузки. Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:

add_filter('auth_cookie_expiration', function($expiration, $user_id, $remember) {
    // Установим срок жизни куки в 1 день (86400 секунд)
    return 86400;
}, 10, 3);

2. Создание WP-Cron задачи для очистки устаревших сессий

WordPress не удаляет сессии мгновенно после истечения срока, поэтому создадим задачу, которая будет периодически очищать устаревшие сессии.

Добавьте в functions.php следующий код:

if (!wp_next_scheduled('wpstandart_cleanup_expired_sessions')) {
    wp_schedule_event(time(), 'daily', 'wpstandart_cleanup_expired_sessions');
}

add_action('wpstandart_cleanup_expired_sessions', function() {
    global $wpdb;
    // Получаем всех пользователей
    $users = get_users(array('fields' => 'ID'));
    foreach ($users as $user_id) {
        $manager = WP_Session_Tokens::get_instance($user_id);
        $manager->destroy_expired();
    }
});

Этот код запускает ежедневную задачу, которая для каждого пользователя удаляет устаревшие сессии.

3. Принудительное удаление всех сессий для пользователя (если нужно)

Если нужно срочно очистить все сессии какого-либо пользователя (например, после подозрительной активности), используйте функцию:

$manager = WP_Session_Tokens::get_instance($user_id);
$manager->destroy_all();

Как проверить, что решение работает

  • Проверьте расписание задач WP-Cron с помощью плагина WP Crontrol — должна быть задача wpstandart_cleanup_expired_sessions, запускающаяся ежедневно.
  • В базе данных в таблице wp_usermeta с ключом session_tokens количество активных сессий должно уменьшаться с течением времени.
  • Проверьте время жизни cookie авторизации в браузере — она должна быть около 1 дня.
  • Для теста можно вручную вызвать хук с помощью кода do_action('wpstandart_cleanup_expired_sessions'); и проверить удаление устаревших сессий.

Частые ошибки и как их исправить

  • Отсутствие WP-Cron на хостинге: Если задачи по очистке не запускаются, возможно, WP-Cron отключен. Проверьте наличие DISABLE_WP_CRON в wp-config.php и настройте системный cron для вызова wp-cron.php.
  • Неправильный срок жизни куки: Если срок слишком большой, сессии не удаляются вовремя. Проверьте фильтр auth_cookie_expiration.
  • Кэширование: Если используется агрессивное кэширование, куки могут вести себя некорректно, что влияет на сессии. Исключите страницы с авторизацией из кэша.

Практические советы для безопасности и производительности

  • Регулярно очищайте устаревшие сессии — это снижает нагрузку на базу и уменьшает риск доступа злоумышленников.
  • Используйте фильтр auth_cookie_expiration для балансировки удобства и безопасности. Для сайтов с высокой безопасностью лучше ставить 1-3 дня.
  • Обеспечьте корректную работу WP-Cron или настройте системный cron для надежности задач.
  • Минимизируйте количество активных сессий пользователя, например, ограничивая одновременный вход на несколько устройств (потребует кастомной доработки).

Таблица сравнения способов очистки сессий

МетодПлагинКодКомпромисс
Автоматическая очисткаНет стандартных плагиновWP-Cron + WP_Session_TokensТребуется базовое программирование и настройка WP-Cron
Ручная очисткаПлагины безопасности (например, Wordfence)Вызов destroy_all() для пользователяТребует вмешательства администратора, не автоматизировано
Управление сроком сессийНекоторые плагины безопасностиФильтр auth_cookie_expirationБаланс между удобством и безопасностью
Как создать удалённый вывод постов WordPress через REST API с примерами кода
18.02.2026
Автоматическое удаление неактивных заказов WooCommerce по статусу и времени
22.07.2026
Как автоматически удалять неактивных пользователей в WordPress с помощью кода
06.07.2026
Как правильно удалить или изменить URL продуктов в WooCommerce без потери SEO
17.04.2026
Как запретить XML-RPC в WordPress через .htaccess и PHP без поломки админки
22.08.2026