Работа с хуком wp_login в администрировании сайта
Основы работы с действием wp_login
Хук wp_login срабатывает в момент успешной аутентификации пользователя в WordPress. Он передаёт два параметра: имя пользователя ($user_login) и объект пользователя ($user). Использование этого действия позволяет добавить произвольную логику после входа.
Наиболее универсальный способ зарегистрировать обработчик - разместить следующий код в файле functions.php вашей темы или в пользовательском плагине:
add_action( 'wp_login', 'my_custom_login_action', 10, 2 );
function my_custom_login_action( $user_login, $user ) {
// Ваш код
}
Wp admin options php (страница настроек в админке wordpress)
Первый параметр - $user_login содержит строку логина, второй - $user - объект WP_User. Приоритет 10 означает стандартный порядок выполнения, а число 2 - количество принимаемых аргументов.
Этот подход подходит для большинства задач: перенаправление, логирование, ограничения и т.д.
Как изменить маршрут после успешного входа?
Для перенаправления используется функция wp_redirect() с последующим exit:
add_action( 'wp_login', 'redirect_after_login', 10, 2 );
function redirect_after_login( $user_login, $user ) {
$redirect_url = home_url('/dashboard/');
wp_redirect( $redirect_url );
exit;
}
Admin post new php (создание нового поста в админке wordpress)
Важно: вызов exit обязателен, иначе выполнение скрипта продолжится. Можно также учитывать роль пользователя:
add_action( 'wp_login', 'conditional_redirect_after_login', 10, 2 );
function conditional_redirect_after_login( $user_login, $user ) {
if ( in_array( 'administrator', (array) $user->roles ) ) {
$redirect_url = admin_url();
} else {
$redirect_url = home_url('/profile/');
}
wp_redirect( $redirect_url );
exit;
}
Wp login php action (действие логина wordpress)
Как сохранять историю входов в пользовательские метаданные?
Пример записи времени последнего входа:
add_action( 'wp_login', 'log_last_login_time', 10, 2 );
function log_last_login_time( $user_login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
}
Admin post php (администрирование post в php)
Результат: в таблице wp_usermeta появляется запись с ключом last_login.
Как предотвратить одновременные сессии?
Для ограничения активных сессий используется проверка количества записей в таблице wp_sessions или использование transient API:
add_action( 'wp_login', 'limit_simultaneous_sessions', 10, 2 );
function limit_simultaneous_sessions( $user_login, $user ) {
$max_sessions = 2;
$sessions = WP_Session_Tokens::get_instance( $user->ID );
$all_tokens = $sessions->get_all();
if ( count( $all_tokens ) > $max_sessions ) {
wp_logout();
wp_die( 'Превышено допустимое количество одновременных сессий.' );
}
}
Обратите внимание: для корректной работы требуется активировать поддержку сессий в WordPress (например, с помощью плагина или добавочного кода).
Как уведомлять администратора о входе определённого пользователя?
Отправка письма при входе пользователя с ролью «administrator»:
add_action( 'wp_login', 'notify_admin_on_admin_login', 10, 2 );
function notify_admin_on_admin_login( $user_login, $user ) {
if ( in_array( 'administrator', (array) $user->roles ) ) {
$to = get_option( 'admin_email' );
$subject = 'Вход администратора: ' . $user_login;
$message = 'Пользователь ' . $user_login . ' вошёл в систему. Время: ' . current_time( 'mysql' );
wp_mail( $to, $subject, $message );
}
}
Типичные ошибки и проблемы:
- Хук не срабатывает при входе через REST API, XML-RPC или через WooCommerce. Для таких случаев необходимо использовать соответствующие хуки (например, wp_authenticate_user или woocommerce_login_credentials).
- Использование wp_redirect() без exit приводит к ошибке «headers already sent» или продолжению выполнения скрипта.
- Модификация глобальных переменных ($_POST, $_SERVER) внутри обработчика может быть небезопасна.
- При добавлении кода в functions.php темы он перестаёт работать после смены темы. Рекомендуется использовать отдельный плагин для пользовательских функций.
- Забывание проверки существования пользователя и его ролей приводит к ошибкам, если объект $user не определён.
Действие wp_login открывает широкие возможности для кастомизации процесса аутентификации. Грамотное применение хука повышает безопасность и удобство работы с сайтом.
Расширенные примеры использования wp_login
Пример 1. Перенаправление с учётом источника (реферера)
Код ниже перенаправляет пользователя на страницу, с которой он пришёл, если это внутренняя страница сайта. В противном случае - на главную.
add_action( 'wp_login', 'redirect_based_on_referrer', 10, 2 );
function redirect_based_on_referrer( $user_login, $user ) {
$referrer = wp_get_raw_referer();
if ( $referrer && ( strpos( $referrer, home_url() ) === 0 ) ) {
$redirect_url = $referrer;
} else {
$redirect_url = home_url();
}
wp_redirect( $redirect_url );
exit;
}
Пользователь после входа будет возвращён на предыдущую страницу, например, на страницу товара, если он залогинился из корзины.
Пример 2. Детальное логирование входа в файл
Запись в кастомный лог-файл с IP, User-Agent и временем.
add_action( 'wp_login', 'log_login_to_file', 10, 2 );
function log_login_to_file( $user_login, $user ) {
$log_dir = WP_CONTENT_DIR . '/login-logs';
if ( ! file_exists( $log_dir ) ) {
wp_mkdir_p( $log_dir );
}
$log_file = $log_dir . '/logins.log';
$data = sprintf(
"[%s] %s (ID: %d) from IP %s - UA: %s\n",
current_time( 'mysql' ),
$user_login,
$user->ID,
$_SERVER['REMOTE_ADDR'] ?? 'unknown',
$_SERVER['HTTP_USER_AGENT'] ?? 'unknown'
);
file_put_contents( $log_file, $data, FILE_APPEND | LOCK_EX );
}
В папке /wp-content/login-logs/ появится файл logins.log с записями вида:
[2025-03-07 14:22:00] admin (ID: 1) from IP 192.168.1.1 - UA: Mozilla/5.0...
Пример 3. Блокировка входа в ночное время
Запрет на вход для обычных пользователей с 23:00 до 6:00.
add_action( 'wp_login', 'block_night_login', 10, 2 );
function block_night_login( $user_login, $user ) {
$current_hour = (int) current_time( 'G' );
if ( $current_hour >= 23 || $current_hour < 6 ) {
if ( ! in_array( 'administrator', (array) $user->roles ) ) {
wp_logout();
wp_die( 'Вход в ночное время запрещён для вашей роли. Попробуйте позже.' );
}
}
}
Пользователь с ролью «subscriber» при попытке войти в 23:30 будет разлогинен и увидит сообщение об ошибке.
Пример 4. Отправка уведомления в Telegram при входе администратора
Использует Telegram Bot API. Требуется предварительно создать бота и получить chat_id.
add_action( 'wp_login', 'telegram_notify_admin_login', 10, 2 );
function telegram_notify_admin_login( $user_login, $user ) {
if ( ! in_array( 'administrator', (array) $user->roles ) ) {
return;
}
$token = 'ВАШ_ТОКЕН_БОТА';
$chat_id = 'ВАШ_CHAT_ID';
$message = 'Администратор ' . $user_login . ' вошёл в систему в ' . current_time( 'mysql' );
$url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$chat_id}&text=" . urlencode( $message );
wp_remote_get( $url );
}
В Telegram-чат бота придёт сообщение: «Администратор admin вошёл в систему в 2025-03-07 14:22:00».
Пример 5. Проверка IP через внешний сервис (Project Honey Pot)
Интеграция с API Project Honey Pot для блокировки известных спамеров.
add_action( 'wp_login', 'check_ip_against_honeypot', 1, 2 );
function check_ip_against_honeypot( $user_login, $user ) {
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
if ( empty( $ip ) ) {
return;
}
$api_key = 'ВАШ_КЛЮЧ_API';
$url = "http://dnsbl.httpbl.org/check?key={$api_key}&ip={$ip}";
$response = wp_remote_get( $url );
if ( is_wp_error( $response ) ) {
return;
}
$body = wp_remote_retrieve_body( $response );
if ( strpos( $body, '127.0.0.1' ) === 0 && substr( $body, -1 ) >= 2 ) {
// IP считается угрозой
wp_logout();
wp_die( 'Доступ заблокирован. Ваш IP найден в чёрном списке.' );
}
}
Если IP пользователя присутствует в базе Project Honey Pot с рейтингом 2 или выше, он будет разлогинен с сообщением о блокировке.