WordPress как на ладони

wp_authenticate()WP 2.5.0

Аутентифицирует пользователя (проверяет данные авторизации: логин/email и пароль) и возвращает объект пользователя, если проверка прошла успешно.

Функция не авторизует пользователя, а только проверяет данные. Для фактической авторизации полученные данные нужно использовать в wp_set_auth_cookie().

Используйте wp_signon(), когда нужно проверить логин, пароль и одновременно авторизовать юзера.

Pluggable функция — эту функцию можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.

Замена функции (переопределение) — в must-use или обычном плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.

Основа для: user_pass_ok(), wp_signon()
Хуки из функции

Возвращает

WP_User|WP_Error. Объект данных пользователя (WP_User), если переданные данные прошли проверку. Объект WP_Error в противном случае.

Использование

wp_authenticate( $username, $password );
$username(строка) (обязательный)
Логин пользователя. С версии 4.5. можно указывать email.
$password(строка) (обязательный)
Пароль пользователя.

Примеры

0

#1 Проверим данные авторизации юзера

Предположим у нас есть логин и пароль пользователя и нам нужно проверить есть ли юзер с таким логином и паролем.

$username = 'truegamer';
$password = 'live123';

// пробуем получить юзера
$auth = wp_authenticate( $username, $password );

// Проверка ошибок
if ( is_wp_error( $auth ) ) {
	$error_string = $auth->get_error_message();
	echo '<div id="message" class="error"><p>' . $error_string . '</p></div>';
}
else {
	// юзер с указанным логином и паролем существует!
	// авторизуем его
	wp_set_auth_cookie( $auth->ID );
}
0

#2 Отключение авторизации юзера по логину

С версии WP 4.5 Wordpress поле логин можно ввести также и email. За такую проверку логина отвечают две функции, которые вешаются на хук authenticate в файле /wp-includes/default-filters.php.

add_filter( 'authenticate', 'wp_authenticate_username_password',  20, 3 ); // обычный логин
add_filter( 'authenticate', 'wp_authenticate_email_password',     20, 3 ); // email в качестве логина

Таким образом, чтобы отключить авторизацию по логину, но оставить авторизацю по почте, нужно просто отключить фильтр связанный с логином:

remove_filter( 'authenticate', 'wp_authenticate_username_password',  20, 3 );
0

#3 Отключение авторизации юзера по email

И точно также, чтобы оставить как и было до версии 4.5. авторизацию только по логину игнорируя email, нужно удалить фильтр связанный c email:

remove_filter( 'authenticate', 'wp_authenticate_email_password', 20, 3 );

Список изменений

С версии 2.5.0 Введена.
С версии 4.5.0 $username now accepts an email address.

Код wp_authenticate() WP 6.5.2

function wp_authenticate( $username, $password ) {
	$username = sanitize_user( $username );
	$password = trim( $password );

	/**
	 * Filters whether a set of user login credentials are valid.
	 *
	 * A WP_User object is returned if the credentials authenticate a user.
	 * WP_Error or null otherwise.
	 *
	 * @since 2.8.0
	 * @since 4.5.0 `$username` now accepts an email address.
	 *
	 * @param null|WP_User|WP_Error $user     WP_User if the user is authenticated.
	 *                                        WP_Error or null otherwise.
	 * @param string                $username Username or email address.
	 * @param string                $password User password.
	 */
	$user = apply_filters( 'authenticate', null, $username, $password );

	if ( null == $user ) {
		/*
		 * TODO: What should the error message be? (Or would these even happen?)
		 * Only needed if all authentication handlers fail to return anything.
		 */
		$user = new WP_Error( 'authentication_failed', __( '<strong>Error:</strong> Invalid username, email address or incorrect password.' ) );
	}

	$ignore_codes = array( 'empty_username', 'empty_password' );

	if ( is_wp_error( $user ) && ! in_array( $user->get_error_code(), $ignore_codes, true ) ) {
		$error = $user;

		/**
		 * Fires after a user login has failed.
		 *
		 * @since 2.5.0
		 * @since 4.5.0 The value of `$username` can now be an email address.
		 * @since 5.4.0 The `$error` parameter was added.
		 *
		 * @param string   $username Username or email address.
		 * @param WP_Error $error    A WP_Error object with the authentication failure details.
		 */
		do_action( 'wp_login_failed', $username, $error );
	}

	return $user;
}
8 комментариев
    Войти