Функция wp_set_current_user()
изменяет текущего пользователя в WordPress по его ID или имени пользователя. Она не авторизует пользователя, а лишь изменяет глобальную переменную $current_user
, что позволяет выполнять действия от имени другого пользователя без необходимости авторизации.
wp_set_current_user( int|null $id, string $name = '' ): WP_User
Описание
Функция используется для изменения текущего пользователя, что может быть полезно в случае, если вам нужно временно выполнять действия от имени другого пользователя, не авторизуя его. Это открывает возможности для выполнения административных задач или выполнения кода с различными правами доступа.
- Если известно ID пользователя, его можно передать в качестве первого параметра.
- Если ID неизвестен, можно передать имя пользователя, а ID оставить равным
null
.
Параметры
- $id (int|null) (обязательный): ID пользователя. Если ID неизвестен, можно передать
null
и указать имя пользователя в параметре$name
. - $name (string) (необязательный): Имя пользователя (логин). По умолчанию пустая строка.
Возвращаемое значение
- WP_User: Объект класса
WP_User
, представляющий текущего пользователя.
Глобальные переменные
Функция устанавливает следующие глобальные переменные, связанные с текущим пользователем:
$user_ID
$user_level
$userdata
$user_login
$user_email
$user_url
$user_identity
Эти переменные используются для работы с текущим пользователем в разных частях WordPress.
Особенности
- Pluggable функция: Это означает, что функцию можно переопределить в плагинах, если это необходимо. Например, можно создать пользовательскую реализацию
wp_set_current_user()
в плагине, чтобы она заменила стандартное поведение WordPress. - Функцию нельзя вызывать до подключения всех плагинов. Обычно её нужно использовать внутри хука
plugins_loaded
или позже, например, в хукinit
.
Пример 1: Установка текущего пользователя и авторизация
Этот пример показывает, как установить текущего пользователя и авторизовать его:
$user_id = 12345;
$user = get_user_by( 'id', $user_id );
if( $user ) {
wp_set_current_user( $user_id, $user->user_login );
wp_set_auth_cookie( $user_id );
do_action( 'wp_login', $user->user_login );
}
В этом примере сначала извлекается пользователь по ID, затем он устанавливается как текущий с помощью wp_set_current_user()
, и выполняется авторизация через wp_set_auth_cookie()
.
Пример 2: Переключение между пользователями
Иногда нужно временно переключиться на другого пользователя, а затем вернуть исходного. Это полезно для выполнения задач от имени другого пользователя.
// Сохраняем ID текущего пользователя
$original_user_id = get_current_user_id();
// Переключаемся на пользователя с ID 15
wp_set_current_user( 15 );
// Выполняем необходимый код...
// Восстанавливаем исходного пользователя
wp_set_current_user( $original_user_id );
Этот код временно меняет текущего пользователя на пользователя с ID 15, после чего возвращает исходного пользователя.
Пример 3: Переустановка текущего пользователя после обновления профиля
Если вы обновили данные профиля пользователя и хотите, чтобы WordPress заново инициализировал переменную $current_user
, можно использовать следующий код:
global $current_user;
$cuser_id = $current_user->ID; // Запоминаем ID текущего пользователя
unset( $current_user ); // Удаляем, чтобы wp_set_current_user() переустановила все заново
wp_set_current_user( $cuser_id ); // Переустанавливаем пользователя
Это необходимо для того, чтобы функции, работающие с текущим пользователем, возвращали актуальные данные после обновления профиля.
Когда использовать
wp_set_current_user()
полезна в следующих ситуациях:
- Выполнение действий от имени другого пользователя без его авторизации.
- Переключение между пользователями во время выполнения кода.
- Выполнение тестов или административных задач с разными правами доступа.
Заключение
Функция wp_set_current_user()
— это мощный инструмент для управления текущим пользователем в WordPress. Она позволяет изменять глобальные переменные, связанные с пользователем, и выполнять действия от имени других пользователей, что особенно полезно в ситуациях, когда нужно временно изменить контекст выполнения кода.