Как изменить текст ошибки авторизации WordPress

// Return custom message on login
function failed_login () {
    return 'Неверный Логин или Пароль';
}
add_filter ( 'login_errors', 'failed_login' );

Следующий код удаляет старую функцию WordPress и создает новую функцию с уникальным именем:

remove_filter( 'authenticate', 'wp_authenticate_username_password' );
add_filter( 'authenticate', 'wpse_115539_authenticate_username_password', 20, 3 );
/**
 * Remove WordPress filer and write our own with changed error text.
 */
function wpse_115539_authenticate_username_password( $user, $username, $password ) {
    if ( is_a($user, 'WP_User') )
        return $user;

    if ( empty( $username ) || empty( $password ) ) {
        if ( is_wp_error( $user ) )
            return $user;

        $error = new WP_Error();

        if ( empty( $username ) )
            $error->add( 'empty_username', __('<strong>ERROR</strong>: The username field is empty.' ) );

        if ( empty( $password ) )
            $error->add( 'empty_password', __( '<strong>ERROR</strong>: The password field is empty.' ) );

        return $error;
    }

    $user = get_user_by( 'login', $username );

    if ( !$user )
        return new WP_Error( 'invalid_username', sprintf( __( '<strong>ERROR</strong>: Invalid username. <a href="%s" title="Password Lost and Found">Lost your password</a>?' ), wp_lostpassword_url() ) );

    $user = apply_filters( 'wp_authenticate_user', $user, $password );
    if ( is_wp_error( $user ) )
        return $user;

    if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) )
        return new WP_Error( 'incorrect_password', sprintf( __( '<strong>ERROR</strong>: The password you entered for the username <strong>%1$s</strong> is incorrect. <a href="%2$s" title="Password Lost and Found">Lost your password</a>?' ),
        $username, wp_lostpassword_url() ) );

    return $user;
}

Источник

В первом коде есть недостатки: в случае верного ввода логина этот логин запоминается в поле формы для ввода имени пользователя, что дает понять потенциальному взломщику, что логин был введен верно, изменится также текст сообщения о запрете регистрации. Чтобы избежать этого:

// Return custom message on login
add_filter( 'authenticate', 'my_auth', 20, 3 );
function my_auth($user, $username, $password) {
	if( isset( $user->errors['invalid_username'] ) || isset( $user->errors['incorrect_password'] ) ) {
		return new WP_Error('broke', '<b>ОШИБКА</b>: неверный логин или пароль');
	}
	return $user;
}

Источник

add_filter( 'login_errors', 'my_login_errors' );

function my_login_errors(){
 return "Ошибка!";
}

Давайте его разберем. Итак, для того, чтобы привязать нашу функцию к хуку, мы можем воспользоваться функциями add_filter() или add_action() в зависимости от того, является ли данный хук фильтром или действием.

Функция add_filter() цепляет к фильтру login_errors() нашу функцию my_login_errors(), которая описана ниже. Фильтр login_errors() применяется к ошибкам авторизации, которые выводятся на экран. Соответственно, мы можем просто заменить эти ошибки своей, что мы и делаем, возвращая нужный текст ошибки функцией my_login_errors(). В общем, ничего сложного.

Попробуем авторизоваться теперь. Как видим, на экран сейчас выводится наш текст ошибки и в случае неверного ввода логина, и в случае верного ввода логина. Все вроде бы замечательно. Однако вот незадача: в случае верного ввода логина этот логин запоминается в поле формы для ввода имени пользователя, что дает понять потенциальному взломщику, что логин был введен верно.

Поэтому очевидно, что данный код решил нашу проблему лишь частично. Что же делать? Давайте попробуем воспользоваться другим хуком, который занимается не выводом ошибок на экран, а непосредственно связан с авторизацией и возвратом данных ошибок. Для этого мы воспользуемся фильтром authenticate.

В видео версии урока вы найдете подробное описание работы с данным хуком. Здесь же я приведу сам код и немного прокомментирую работу с ним:

// Return custom message on login
add_filter( 'authenticate', 'my_auth', 20, 3 );
function my_auth($user, $username, $password) {
	if( isset( $user->errors['invalid_username'] ) || isset( $user->errors['incorrect_password'] ) ) {
		return new WP_Error('broke', '<b>ОШИБКА</b>: неверный логин или пароль');
	}
	return $user;
}

Итак, к фильтру authenticate мы прицепили функцию my_auth(). Также передадим 2 дополнительных параметра. Третий параметр – 20 – отвечает за приоритет выполнения нашей функции (по умолчанию 10). Чем выше приоритет, тем позже функция выполнится. Наша функция должна выполнится позже добавленных к authenticate фильтров, поэтому мы установили приоритет больше 10. Четвертый параметр – 3 – отвечает за количество аргументов, которое будет принимать наша пользовательская функция. Функция my_auth() должна принять именно 3 аргумента, описания которых вы можете найти в документации к хуку authenticate.

Ну и можем проверить наш код. Теперь, даже если мы введем верный логин, но неверный пароль, то логин не будет сохраняться. Ну и при некорректной авторизации мы всегда будем видеть собственный текст ошибки.

Ещё вариант

add_filter( 'authenticate', 'custom_authenticate_username_password', 30, 3);
function custom_authenticate_username_password( $user, $username, $password ) {
    if ( is_a($user, 'WP_User') ) { return $user; }

    if ( empty($username) || empty($password) )
    {
        $error = new WP_Error();
        $user  = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));

        return $error;
    }
}

Источник

Добавил в этот код эффект тряски (registration_errors | shake_error_codes)

// Return custom message on login
add_filter( 'authenticate', 'my_auth', 20, 3 );
add_filter( 'shake_error_codes', 'add_shake_error_code' );
function my_auth($user, $username, $password) {
	if( isset( $user->errors['invalid_username'] ) || isset( $user->errors['incorrect_password'] ) ) {
		return new WP_Error('broke', '<b>ОШИБКА</b>: неверный логин или пароль');
	}
	return $user;
}

function add_shake_error_code( $shake_error_codes ) {
	return array_merge( $shake_error_codes, [ 'broke' ] );
}

Полностью удалить сообщения об ошибках

add_filter('login_errors',create_function('$a', "return null;"));