¿Cómo puedo redirigir al usuario después de ingresar una contraseña incorrecta?

12

Estoy usando wp_login_form() para mostrar el formulario de inicio de sesión en una ventana de diálogo de jQuery.

Si el usuario ingresa una contraseña incorrecta, se lo lleva al backend. No quiero eso ¿Hay alguna manera de notificar al usuario que ingresó una contraseña incorrecta y aún permanece en la misma página?

Antes de que viniera wp_login_form() , estaba usando un complemento. Espero que pueda evitar el uso de un complemento para esto.

Mi código:

wp_login_form( array(
  'label_remember' => __( 'Remember me' ),
  'label_log_in' => __( 'Login' )
) );
    
pregunta Steven 26.04.2011 - 16:07

6 respuestas

5

wp_login_form() crea un formulario con un atributo de acción de site_url/wp-login.php y eso significa que cuando hace clic en el botón de envío, el formulario se publica en site_url/wp-login.php , que ignora redirect_to en los errores (como una contraseña incorrecta), por lo que en su caso vuelva a usar un complemento o vuelva a crear todo el proceso de inicio de sesión y, de esa forma, tendrá control sobre los errores, eche un vistazo a Verifique el nombre de usuario correcto en el formulario de inicio de sesión personalizado que es una pregunta muy similar.

    
respondido por el Bainternet 26.04.2011 - 17:53
24

Vine aquí desde google. Pero la respuesta no me satisfizo. Estuve buscando un tiempo y encontré una mejor solución.

Agregue esto a su 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;
   }
}
    
respondido por el Alexey 08.06.2012 - 23:06
15

El método actual que estoy usando para tratar todos los problemas descritos aquí funciona muy bien incluso con un nombre de usuario / contraseña en blanco y no depende de JavaScript (aunque el js podría ser bueno junto con esto).

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

La clave es este filtro para cambiar la forma en que se trata un nombre de usuario / contraseña en blanco:

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

Puede llevar esto un paso más allá y reemplazar completamente wp-login.php redirigiendo a los usuarios a su página de inicio de sesión personalizada y usar esa página también para la redirección de login_failed. Código completo:

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

Personalice y agregue estos para agregar su logotipo a la página de inicio de sesión de wp para recuperar la contraseña:

// 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'); }

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

EDITAR: acabo de implementar esto en otro sitio desde cero, y encontré que el "paso adelante" anterior era más completo, y corregí pequeños errores de sintaxis en "add_actions". Se agregaron algunos comentarios y un método para agregar automáticamente el formulario de inicio de sesión a la página de inicio de sesión sin un archivo de plantilla por separado. El método del formulario de inicio de sesión debería funcionar en la mayoría de los casos, ya que está adjunto a "the_content", podría causar y emitir problemas si tiene más de un bucle en la página de inicio de sesión, solo use una plantilla page-login.php en ese caso.

    
respondido por el Jake 03.07.2013 - 20:11
4

Una solución para el punto de Szczepan Hołyszewski sobre campos vacíos en la solución aceptada, la siguiente jQuery evitará ir a la página estándar de inicio de sesión de wp: (agregar a la plantilla de la página de inicio de sesión o 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;
});
    
respondido por el willytk 09.05.2013 - 22:57
0

Una adición a la respuesta de Alexey. Puede agregar una función jquery para verificar que uno de los campos no esté en blanco. De esa manera, el formulario no se enviará a menos que haya algo que verificar, lo que evita que WordPress redirija a /wp-login.php.

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

Aún no estoy seguro de cómo arreglar el aspecto de la contraseña olvidada

    
respondido por el user28022 26.02.2013 - 06:09
-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;
});
    
respondido por el farhan 11.05.2018 - 14:20

Lea otras preguntas en las etiquetas