Я создал шаблон для входа с помощью функции 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's a valid referrer, and it's 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. Если пользователь вводит истинное имя пользователя, но неверный пароль, он будет показывать ошибку как «неправильный пароль »
2. Если пользователь вводит ложное имя пользователя, но верно, он будет показывать ошибку как «invalid_username»
3. Если пользователь вводит неправильное имя пользователя, но неверный пароль, он будет показывать ошибку как «invalidcombo»,
Добавьте так, пожалуйста, проверьте переменную $ login_failed_error_codes в коде … Я сделал некоторый поиск. Я получил некоторый класс под названием «WP_error». Но я не знаю, как это работает с этим кодом.
Я просто застрял в том, как передать объект WP_error из wp-login.php в мой шаблон csutom?
Спасибо … любая помощь будет приемлемой.
Думаю, я понимаю, чего вы пытаетесь достичь. Вы хотите, чтобы на вашем собственном сайте входа отображалась ошибка входа в систему. Я предполагаю, что вы уже знаете, как получить параметры $_GET
, поскольку вы используете это, чтобы передать свой параметр login_failed
.
login_redirect
этого login_redirect
фильтр 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(); } }
Похоже, следующий ответ – это то, что вам нужно:
Вам нужно подключиться к аутентификатору wordpress hook. Затем верните новый объект 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; }
Если вы создали пользовательский шаблон для входа в систему, то почему вы не используете метод 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>
Я не тестировал, но он должен работать.
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's a valid referrer, and it's 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' );