Как я могу перенаправить пользователя после ввода неверного пароля?

16

Я использую wp_login_form()для отображения формы входа в диалоговом окне jQuery.

Если пользователь вводит неправильный пароль, он переходит на сервер. Я не хочу этого Есть ли способ уведомить пользователя, что он ввел неправильный пароль и все еще остается на той же странице?

Перед wp_login_form() я использовал плагин. Я надеюсь, что смогу избежать использования плагина для этого.

Мой код:

wp_login_form( array(
  'label_remember' => __( 'Remember me' ),
  'label_log_in' => __( 'Login' )
) );
Стивен
источник

Ответы:

5

wp_login_form()создает форму с атрибутом действия site_url/wp-login.php, что означает, что когда вы нажимаете кнопку отправки, форма публикуется, в site_url/wp-login.phpкоторой игнорируется redirect_to при ошибках (например, неверный пароль), поэтому в вашем случае либо вернитесь к использованию плагина, либо заново создайте весь процесс входа в систему и таким образом вы будете контролировать ошибки, посмотрите на Проверка правильности имени пользователя в пользовательской форме входа, что очень похоже на вопрос.

Bainternet
источник
26

Я пришел сюда из Google. Но ответ меня не удовлетворил. Я долго искал и нашел лучшее решение.

Добавьте это в ваши functions.php :

add_action( 'wp_login_failed', 'my_front_end_login_fail' );  // hook failed login

function my_front_end_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') ) {
      wp_redirect( $referrer . '?login=failed' );  // let's append some information (login=failed) to the URL for the theme to use
      exit;
   }
}
Алексей
источник
Спасибо Алексей, я проверю это (так как я все еще использую плагин)
Стивен
7
Решение Алексея работает, когда вводятся неверные учетные данные, но, к сожалению, не удается, когда пользователь забывает ввести имя пользователя или пароль. Очевидно, Wordpress даже не пытается войти в систему в этом случае, поэтому действие wp_login_failed не выполняется.
Щепан Холышевский,
Я бы использовал wp_get_referer (), чтобы сэкономить время: codex.wordpress.org/Function_Reference/wp_get_referer
Джейк,
1
Кроме того, вы определенно используете здесь add_query_arg, поэтому wp_redirect должен быть следующим: "wp_redirect (add_query_arg ('login', 'failed', $ referrer));"
Джейк
18

Текущий метод, который я использую для решения всех проблем, изложенных здесь, прекрасно работает даже с пустым именем пользователя и паролем и не зависит от javascript (хотя js мог бы подойти вместе с этим).

add_action( 'wp_login_failed', 'custom_login_failed' );
function custom_login_failed( $username )
{
    $referrer = wp_get_referer();

    if ( $referrer && ! strstr($referrer, 'wp-login') && ! strstr($referrer,'wp-admin') )
    {
        wp_redirect( add_query_arg('login', 'failed', $referrer) );
        exit;
    }
}

Ключ - этот фильтр, чтобы изменить способ обработки пустого имени пользователя / пароля:

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;
    }
}

Вы можете сделать этот шаг дальше и полностью заменить wp-login.php, перенаправив пользователей на свою пользовательскую страницу входа и использовать эту страницу также для перенаправления login_failed. Полный код:

/**
 * Custom Login Page Actions
 */
// Change the login url sitewide to the custom login page
add_filter( 'login_url', 'custom_login_url', 10, 2 );
// Redirects wp-login to custom login with some custom error query vars when needed
add_action( 'login_head', 'custom_redirect_login', 10, 2 );
// Updates login failed to send user back to the custom form with a query var
add_action( 'wp_login_failed', 'custom_login_failed', 10, 2 );
// Updates authentication to return an error when one field or both are blank
add_filter( 'authenticate', 'custom_authenticate_username_password', 30, 3);
// Automatically adds the login form to "login" page
add_filter( 'the_content', 'custom_login_form_to_login_page' );

/**
 * Custom Login Page Functions
 */
function custom_login_url( $login_url='', $redirect='' )
{
    $page = get_page_by_path('login');
    if ( $page )
    {
        $login_url = get_permalink($page->ID);

        if (! empty($redirect) )
            $login_url = add_query_arg('redirect_to', urlencode($redirect), $login_url);
    }
    return $login_url;
}
function custom_redirect_login( $redirect_to='', $request='' )
{
    if ( 'wp-login.php' == $GLOBALS['pagenow'] )
    {
        $redirect_url = custom_login_url();

        if (! empty($_GET['action']) )
        {
            if ( 'lostpassword' == $_GET['action'] )
            {
                return;
            }
            elseif ( 'register' == $_GET['action'] )
            {
                $register_page = get_page_by_path('register');
                $redirect_url = get_permalink($register_page->ID);
            }
        }
        elseif (! empty($_GET['loggedout'])  )
        {
            $redirect_url = add_query_arg('action', 'loggedout', custom_login_url());
        }

        wp_redirect( $redirect_url );
        exit;
    }
}
function custom_login_failed( $username )
{
    $referrer = wp_get_referer();

    if ( $referrer && ! strstr($referrer, 'wp-login') && ! strstr($referrer, 'wp-admin') )
    {
        if ( empty($_GET['loggedout']) )
        wp_redirect( add_query_arg('action', 'failed', custom_login_url()) );
        else
        wp_redirect( add_query_arg('action', 'loggedout', custom_login_url()) );
        exit;
    }
}
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;
    }
}
function custom_login_form_to_login_page( $content )
{
    if ( is_page('login') && in_the_loop() )
    {
        $output = $message = "";
        if (! empty($_GET['action']) )
        {
            if ( 'failed' == $_GET['action'] )
                $message = "There was a problem with your username or password.";
            elseif ( 'loggedout' == $_GET['action'] )
                $message = "You are now logged out.";
            elseif ( 'recovered' == $_GET['action'] )
                $message = "Check your e-mail for the confirmation link.";
        }

        if ( $message ) $output .= '<div class="message"><p>'. $message .'</p></div>';
        $output .= wp_login_form('echo=0&redirect='. site_url());
        $output .= '<a href="'. wp_lostpassword_url( add_query_arg('action', 'recovered', get_permalink()) ) .'" title="Recover Lost Password">Lost Password?</a>';

        $content .= $output;
    }
    return $content;
}

Настройте и добавьте их, чтобы добавить свой логотип на страницу wp-login для восстановления пароля:

// calling it only on the login page
add_action( 'login_enqueue_scripts', 'custom_login_css', 10 );
function custom_login_css() { wp_enqueue_style( 'custom_login_css', get_template_directory_uri() .'/library/css/login.css', false ); }
// changing the logo link from wordpress.org to your site
add_filter( 'login_headerurl', 'custom_login_logo_url' );
function custom_login_logo_url() { return home_url(); }
// changing the alt text on the logo to show your site name
add_filter( 'login_headertitle', 'custom_login_title' );
function custom_login_title() { return get_option('blogname'); }

Логотип логина css:

.login h1 a {
    background: url(../images/login-logo.png) no-repeat top center;
    width: 274px;
    height: 63px;
    text-indent: -9999px;
    overflow: hidden;
    padding-bottom: 15px;
    display: block;
}

РЕДАКТИРОВАТЬ: я только что реализовал это на другом бланке формы сайта и нашел вышеупомянутый «шаг вперед» более полным, и исправил небольшие синтаксические ошибки в «add_actions». Добавлены некоторые комментарии и метод автоматического добавления формы входа на страницу входа без отдельного файла шаблона. Метод формы входа в систему должен работать в большинстве случаев, так как он присоединен к «the_content», он может вызывать и вызывать проблему, если у вас есть более одного цикла на странице входа в систему, просто используйте шаблон page-login.php в этом случае.

Джейк
источник
1
Спасибо, я посмотрю на это (и посмотрю, смогу ли я заставить его работать вместе со сторонним входом в систему, таким как Twitter и FB)
Стивен
1
Джейк - это хорошее законченное решение. Спасибо, что поделился. +1
Генрирайт
В основном это плагин под названием Sewn In Template Login, довольно полный, небольшой плагин. wordpress.org/plugins/sewn-in-template-log-in
Джейк
Хорошо, единственная проблема заключается в том, что он на самом деле не выбрасывает ошибки во
Сия
4

Решение для замечания Щепана Холишевского о пустых полях в принятом решении: следующий jQuery не позволит перейти на стандартную страницу wp-login: (добавить в шаблон страницы входа или footer.php)

jQuery("#loginform-custom").submit(function(){
     var isFormValid = true;
       jQuery("input").each(function()
       {
       if (jQuery.trim($(this).val()).length == 0){
       jQuery(this).addClass("submit_error");
       isFormValid = false;
       }     
     else {
     jQuery(this).removeClass("submit_error");
     }
     });
     return isFormValid;
});
willytk
источник
0

Одно дополнение к ответу Алексея. Вы можете добавить функцию jquery, чтобы проверить, что одно из полей не пустое. Таким образом, форма не будет отправлена, если не будет чего проверять, не позволяя WordPress перенаправить на /wp-login.php.

  <script>
        $("#wp-submit").click(function() {
          var user = $("input#user_login").val();
            if (user == "") {
            $("input#user_login").focus();
            return false;
          }
         });
  </script>   

Все еще не уверен, как исправить забытый пароль

user28022
источник
3
Помните, что WordPress загружает jQuery в режиме «Нет конфликта». $Псевдоним не работает.
s_ha_dum
Вы также должны учитывать, что пользователь нажимает [enter] и не нажимает кнопку входа. Кроме того, вам также необходимо проверить пустой пароль.
Стивен
-1
jQuery("#loginform-custom").submit(function(){
     var isFormValid = true;
       jQuery("input").each(function()
       {
       if (jQuery.trim($(this).val()).length == 0){
       jQuery(this).addClass("submit_error");
       isFormValid = false;
       }     
     else {
     jQuery(this).removeClass("submit_error");
     }
     });
     return isFormValid;
});
Фархан
источник
Пожалуйста, измените свой ответ и добавьте объяснение: почему это может решить проблему?
fuxia