如何在输入错误密码后重定向用户?

时间:2011-04-26 作者:Steven

我正在使用wp_login_form() 在jQuery对话框窗口中显示登录表单。

如果用户输入了错误的密码,用户将被带到后端。我不想那样。有没有办法通知用户他输入了错误的密码,但仍然保持在同一页上?

之前wp_login_form() 我在使用插件。我希望我可以避免使用插件来实现这一点。

我的代码:

wp_login_form( array(
  \'label_remember\' => __( \'Remember me\' ),
  \'label_log_in\' => __( \'Login\' )
) );

7 个回复
最合适的回答,由SO网友:Bainternet 整理而成

wp_login_form() 创建动作属性为的窗体site_url/wp-login.php, 这意味着当您单击“提交”按钮时,表单将发布到site_url/wp-login.php 它忽略了redirect\\u to on errors(如错误的密码),因此在您的情况下,要么返回使用插件,要么重新创建整个登录过程,这样您就可以控制错误,请查看Check for correct username on custom login form 这是一个非常相似的问题。

SO网友:Alexey

我是从谷歌来的。但我并不满意这个答案。我找了一会儿,找到了一个更好的解决方案。

将此添加到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;
   }
}

SO网友:Jake

我目前使用的处理这里列出的所有问题的方法,即使用户名/密码为空,也非常有效,并且不依赖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登录。php将用户重定向到自定义登录页面,并将该页面用于login\\u失败的重定向。完整代码:

/**
 * 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登录页以恢复密码:

// 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;
}
编辑:我刚刚在另一个站点表单scratch上实现了这一点,发现上面的“进一步”更加完整,并修复了“add\\u actions”中的小语法错误。添加了一些注释和方法,可以自动将登录表单添加到登录页面,而无需单独的模板文件。登录表单方法在大多数情况下都应该有效,因为它附加到“The\\u content”,如果您在登录页面上有多个循环,只需使用一个页面登录,它就可能导致并发出问题。这种情况下的php模板。

SO网友:willytk

针对Szczepan Hołyszewski关于公认解决方案中的空字段的观点,以下jQuery将阻止访问标准wp登录页面:(添加到登录页面模板或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;
});

SO网友:Marc Wiest

以下内容对我有用。这两个挂钩都可以在函数中找到wp_authenticate 在内部wp-includes/puggabel.php.

通过检查authenticate 如果登录表单缺少用户名或密码,请进行筛选

function wpse_15633_redirectMissingDataLoginForm($user, $username, $password)
{
    $errors = [];
    empty(trim($password)) && $errors[] = \'password_empty\';
    empty(trim($username)) && $errors[] = \'username_empty\';

    if (! empty($errors)) {

        $redirect_url = add_query_arg([
            \'errors\' => join(\',\', $errors),
        ], site_url(\'login\', \'login_post\'));

        if (wp_safe_redirect($redirect_url)) {
            exit;
        }
    }
    return $user;
}
add_filter(\'authenticate\', \'wpse_15633_redirectMissingDataLoginForm\', 10, 3);
<通过检查wp_login_failed 如果提供的用户名和密码的身份验证失败,请执行操作
function wpse_15633_redirectFailedLoginForm($username, $error)
{
    $redirect_url = add_query_arg([
        \'errors\' => $error->get_error_code(),
    ], site_url(\'login\', \'login_post\'));

    if (wp_safe_redirect($redirect_url)) {
        exit;
    }
}
add_action(\'wp_login_failed\', \'wpse_15633_redirectFailedLoginForm\', 10, 2);

SO网友:user28022

Alexey的回答中增加了一项。您可以添加jquery函数来检查其中一个字段是否为空。这样,表单将不会提交,除非有需要检查的内容,从而阻止WordPress重定向到/wp登录。php。

  <script>
        $("#wp-submit").click(function() {
          var user = $("input#user_login").val();
            if (user == "") {
            $("input#user_login").focus();
            return false;
          }
         });
  </script>   
仍然不确定如何修复忘记密码的问题

SO网友:farhan
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;
});
结束

相关推荐

Login form in popup

我将WP3与defaul主题一起使用。我希望人们在提交评论之前注册。我想做的是建立一个链接,而不是像“留下评论”这样的评论表单。单击此链接将打开一个弹出窗口,其中包含登录/注册表单或评论表单(如果用户已登录)。这可能吗?谢谢