Сделаем вход в админку только через почту, так как стандартно можно зайти через логин. Но вход через логин не безопасен, если вы используете архив авторов.
И также сделаем текст ошибки ‘Не верная почта или пароль’ на все виды ошибок.
add_filter( 'gettext', function ( $translation, $text, $domain ) {
$map = [
'Username or Email Address' => 'Почта',
];
return $map[ $text ] ?? $translation;
}, 10, 3 );
add_filter( 'login_errors', function () {
return 'Не верная почта или пароль';
} );
function avs_email_only_login_set_typed_email( bool $is_email ): void {
$GLOBALS['avs_email_only_typed_email'] = $is_email ? 1 : 0;
}
function avs_email_only_login_typed_email(): bool {
return ! empty( $GLOBALS['avs_email_only_typed_email'] );
}
const AVS_LOGIN_GENERIC_ERROR = 'Не верная почта или пароль';
add_filter( 'authenticate', function ( $user, $username, $password ) {
avs_email_only_login_set_typed_email( false );
$username = trim( (string) $username );
if ( $username === '' ) {
return $user;
}
if ( is_email( $username ) ) {
avs_email_only_login_set_typed_email( true );
$u = get_user_by( 'email', $username );
if ( ! ( $u instanceof WP_User ) ) {
return new WP_Error( 'invalid_login', AVS_LOGIN_GENERIC_ERROR );
}
return wp_authenticate_username_password( null, $u->user_login, $password );
}
return $user;
}, 1, 3 );
add_filter( 'wp_authenticate_user', function ( $user ) {
if ( ! ( $user instanceof WP_User ) ) {
return $user;
}
if ( avs_email_only_login_typed_email() ) {
return $user;
}
return new WP_Error( 'invalid_login', AVS_LOGIN_GENERIC_ERROR );
}, 10, 1 );