Как получить ошибки входа в систему на пользовательской форме входа - PullRequest
0 голосов
/ 20 мая 2019

Я создал пользовательскую форму входа в систему через Elementor, но не могу правильно вывести ошибку, ломает мой сайт.

Я сделал немного кода PHP и исправил его, чтобы попытаться собрать ошибки WP из формы входа WP, но он работает неправильно.

//add hook to redirect the user back to the elementor login page if the login failed
add_action( 'wp_login_failed', 'elementor_form_login_fail' );
function elementor_form_login_fail( $username ) {
    $referrer = $_SERVER['HTTP_REFERER'];  // where did the post submission come from?
    // 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') ) {
        if (is_wp_error($username)) {
        //Login failed, find out why...
        $error_types = array_keys($username->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(preg_replace('/\?.*/', '', $referrer) . '?login=error&reason=' . $error_type );
        exit;
    }
}

Я могу успешно проверить, что пользователь вошел в систему, и вернуть код ошибки с помощью Bootstrap Alert, но я хочу сделать это, чтобы получить точную ошибку.

Я знаю, что форма входа в WP делает это, но я хочу, чтобы эта точная ошибка отображалась в верхней части моего пользовательского имени входа, но всякий раз, когда я добавляю свой код, я получаю сообщение о том, что этот сайт испытывает технические трудности.

Моя форма пользовательского логина находится по адресу https://www.qbeam.co.uk/login.

1 Ответ

0 голосов
/ 21 мая 2019

Я посмотрел на объекты WordPress для ошибок WP, а также на WP Authenticate Hook, и мне удалось не дать пользователю отправить пустую форму, я проверил, пустые ли имя пользователя и пароль, и не отправилформы, а затем я возвращаю код ошибки для формы, как только она была отправлена ​​правильно.

Добавьте следующий код в Functions.php

add_action('init', 'prevent_wp_login');

function prevent_wp_login() {
if(isset($_POST['log']) && isset($_POST['pwd']))
if($_POST['log']=='' && $_POST['pwd']=='')
{
$page = 'https://www.qbeam.co.uk/login/?login=error&reason=blank';
// Redirect to the your url
wp_redirect($page);
exit();
}
else if($_POST['log']=='')
{
$page = 'https://www.qbeam.co.uk/login/?login=error&reason=username';
// Redirect to the your url
wp_redirect($page);
exit();
}
else if($_POST['pwd']=='')
{
$page = 'https://www.qbeam.co.uk/login/?login=error&reason=password';
// Redirect to the your url
wp_redirect($page);
exit();
}
}

add_filter('login_redirect', 'qbeam_login_failed_redirect', 10, 3);
function qbeam_login_failed_redirect($user) {
$referrer = $_SERVER['HTTP_REFERER'];  // where did the post submission come from?
// 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') ) {
if (is_wp_error($user)) {
//Login failed, find out why...
$error_types = array_keys($user->errors);
//Get the reason why login failed
if (is_array($error_types) && !empty($error_types)) {
$error_type = $error_types[0];
}
wp_redirect(preg_replace('/\?.*/', '', $referrer) . "?login=failed&reason=" . $error_type ); 
exit;
} 
}
}

function qbeam_login_redirect( $redirect_to, $request, $user  ) {

return ( is_array( $user->roles ) && in_array( 'administrator', $user->roles ) ) ? admin_url() : site_url() . '/my-account';
}
add_filter( 'login_redirect', 'qbeam_login_redirect', 10, 3 );

add_action('wp_logout','auto_redirect_external_after_logout');
function auto_redirect_external_after_logout(){
wp_redirect( 'https://www.qbeam.co.uk/login/?loggedout=true' );
exit();
}

Затем добавьте что-то похожее на это в своем логинестраница, на которой ваша пользовательская форма входа в систему.

<?php

if( "error" == $_GET['login'] && "blank" == $_GET['reason'] )
{
echo 
"<div class='alert alert-warning alert-dismissible container' style='margin-top:20px; margin-bottom:20px;'>
<a href='#' class='close' data-dismiss='alert' aria-label='close'>&times;</a>
<strong>Error!</strong> Form Cannot Be Blank, Please Try Again.
</div>";
} 

?>

Затем вы создаете баннер для каждой ошибки, с которой вы можете столкнуться в вашей пользовательской форме входа в систему, а затем вы можете использовать пользовательское перенаправление, чтобы остановить любых не вошедших в систему пользователей.зайдя в wp-login, вы можете использовать плагин для того или иного кода в вашем файле Functions.php.

Надеюсь, это поможет кому-то еще позже.

...