Как получить ошибку wp в пользовательской форме входа

Я создал шаблон для входа с помощью функции wp_login_form(). Теперь, если пользователь вводит неверный пароль или имя пользователя, он перенаправляет меня на ту же страницу с аргументом login=failed со следующим кодом:

add_action( 'wp_login_failed', 'front_end_login_fail' );
function front_end_login_fail( $username ) {

$_SESSION['uname'] =  $username;
// Getting URL of the login page
$referrer = $_SERVER['HTTP_REFERER'];    
$login_failed_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password' );

// if there a valid referrer, and it not the default log-in screen
if( !empty( $referrer ) && !strstr( $referrer,'wp-login' ) && !strstr( $referrer,'wp-admin' ) ) {
    wp_redirect( get_permalink( 93 ) . "?login=failed" ); 
    exit;
}

}

СЕЙЧАС эта функция работает нормально, но теперь согласно Wordpress, которые обеспечивают следующее:

1.Если пользователь вводит имя пользователя true, но неправильный пароль, он будет показывать ошибку как "неправильный_пароль"

2.Если пользователь вводит false имя пользователя, но true, он будет показывать ошибку как "invalid_username"

3.Если пользователь вводит неправильное имя пользователя, но неправильный пароль, он будет показывать ошибку как "invalidcombo"

Добавьте так, пожалуйста, проверьте переменную $login_failed_error_codes в коде... Я сделал некоторый поиск. У меня есть класс под названием "WP_error". Но я не знаю, как он работает с этим кодом.

Я просто застрял в том, как передать объект WP_error из wp-login.php в мой шаблон csutom?

Спасибо... любая помощь была бы apapiciable.

Ответ 1

Думаю, я понимаю, чего вы пытаетесь достичь. Вы хотите, чтобы на вашем собственном сайте входа отображалась ошибка входа в систему. Я предполагаю, что вы уже знаете, как получить параметры $_GET, поскольку вы используете это для передачи своего параметра login_failed.

Вместо этого используйте login_redirect фильтр:

add_filter('login_redirect', 'my_login_redirect', 10, 3);
function my_login_redirect($redirect_to, $requested_redirect_to, $user) {
    if (is_wp_error($user)) {
        //Login failed, find out why...
        $error_types = array_keys($user->errors);
        //Error type seems to be empty if none of the fields are filled out
        $error_type = 'both_empty';
        //Otherwise just get the first error (as far as I know there
        //will only ever be one)
        if (is_array($error_types) && !empty($error_types)) {
            $error_type = $error_types[0];
        }
        wp_redirect( get_permalink( 93 ) . "?login=failed&reason=" . $error_type ); 
        exit;
    } else {
        //Login OK - redirect to another page?
        return home_url();
    }
}

Ответ 2

Похоже, следующий ответ - это то, что вам нужно:

Вам нужно подключиться к аутентификатору wordpress. Затем верните новый объект WP_Error для генерации сообщения об ошибке и перенаправления на страницу входа. Вот пример.

add_filter('authenticate', 'check_login_submit', 40, 3);

function check_login_submit($user, $username, $password) {
    $WP_Error = new WP_Error();
    $WP_Error->add('my_error', '<strong>Error</strong>: Something went wrong.');
    return $WP_Error;
}

Ответ 3

Если вы создали пользовательский шаблон для входа в систему, то почему бы вам не использовать метод wp_signon с помощью пользовательской формы? он вернет объект WP_error на false, а в true он вернет объект $user.

<?php
if(isset($_POST['submit'])){
        $creds = array();
        $creds['user_login'] = $_POST['user_email'];
        $creds['user_password'] = $_POST['user_password'];
        $creds['remember'] = true;
        $user = wp_signon( $creds, false );
        if ( is_wp_error($user) )
            echo $user->get_error_message();
}
?>

<form id="user-credentials" method="post" action="<?php the_permalink(); ?>">
    <p><input name="user_email" type="text" placeholder="Email" /></p>
    <p><input name="user_password" type="password" placeholder="Password" /></p>
    <p><input type="submit" value="Submit" /></p>
</form>

Я не тестировал, но он должен работать.

Ответ 4

function front_end_login_fail( $username ) {
 $set_confirm=0;
$_SESSION['uname'] =  $username;
/*******Check whether user entered username or email to login*********/
if(is_email( $username ) ){
       if( email_exists( $username )) {
           $uid = email_exists( $username );
           $confirm_mail =get_user_meta($uid,'confirm_mail',true);
           if($confirm_mail!=1){
                $set_confirm=1;
            }
       }
    //$user_check = get_user_by( 'email', $username );
    //print_r($user_check);

}else{

    if ( username_exists( $username ) ){
         $uid = username_exists( $username );
           $confirm_mail =get_user_meta($uid,'confirm_mail',true);
          if($confirm_mail!=1){
               $set_confirm=1;
            }       
    }
}
    //$user_check = get_user_by( 'user_login ', $username );
    //print_r($user_check);

// Getting URL of the login page
$referrer = $_SERVER['HTTP_REFERER'];    


// if there a valid referrer, and it not the default log-in screen
if( !empty( $referrer ) && !strstr( $referrer,'wp-login' ) && !strstr( $referrer,'wp-admin' ) ) {
    wp_redirect( get_permalink( 93 ) . "?login=failed&confirm_email=".$set_confirm); 
    exit;
}

}
add_action( 'wp_login_failed', 'front_end_login_fail' );