Wie kann ich Benutzer umleiten, nachdem ich ein falsches Passwort eingegeben habe?

16

Ich verwende wp_login_form(), um Anmeldeformular in einem jQuery-Dialogfenster anzuzeigen.

Wenn der Benutzer ein falsches Passwort eingibt, wird er zum Backend weitergeleitet. Ich will das nicht. Gibt es eine Möglichkeit, den Benutzer zu benachrichtigen, dass er ein falsches Passwort eingegeben hat und dennoch auf derselben Seite bleibt?

Vorher habe wp_login_form()ich ein Plugin benutzt. Ich hoffe, dass ich es vermeiden kann, dafür ein Plugin zu verwenden.

Mein Code:

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

Antworten:

5

wp_login_form()erstellt ein Formular mit dem Attribut action von site_url/wp-login.php, dh, wenn Sie auf die Schaltfläche "Senden" klicken, wird das Formular gesendet, in site_url/wp-login.phpdem bei Fehlern (z. B. falsches Kennwort) redirect_to ignoriert wird. Verwenden Sie in diesem Fall entweder wieder ein Plugin oder erstellen Sie den gesamten Anmeldevorgang neu und auf diese Weise haben Sie die Kontrolle über Fehler. Schauen Sie unter Auf korrekten Benutzernamen prüfen in einem benutzerdefinierten Anmeldeformular nach, das eine sehr ähnliche Frage darstellt.

Bainternet
quelle
26

Ich bin von Google hierher gekommen. Aber die Antwort hat mich nicht befriedigt. Ich habe eine Weile gesucht und eine bessere Lösung gefunden.

Fügen Sie dies zu Ihrer functions.php hinzu :

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;
   }
}
Alexey
quelle
Danke Alexey, ich werde das testen (da ich noch ein Plugin benutze)
Steven
7
Die Lösung von Alexey funktioniert, wenn falsche Anmeldeinformationen eingegeben werden, schlägt jedoch leider fehl, wenn der Benutzer die Eingabe von Benutzername oder Passwort vergisst. Anscheinend versucht Wordpress in diesem Fall nicht einmal, den Benutzer anzumelden, sodass die Aktion wp_login_failed nicht ausgeführt wird.
Szczepan Hołyszewski
Ich würde hier wp_get_referer () verwenden, um etwas Zeit zu sparen: codex.wordpress.org/Function_Reference/wp_get_referer
Jake
1
Außerdem verwenden Sie hier definitiv add_query_arg, daher sollte wp_redirect wie folgt lauten: "wp_redirect (add_query_arg ('login', 'failed', $ referrer));"
Jake
18

Die aktuelle Methode, die ich verwende, um alle hier beschriebenen Probleme zu lösen, funktioniert auch mit leerem Benutzernamen / Passwort hervorragend und basiert nicht auf Javascript (obwohl das js zusammen mit diesem gut sein könnte).

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

Der Schlüssel ist dieser Filter, um zu ändern, wie ein leerer Benutzername / Passwort behandelt wird:

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

Sie können noch einen Schritt weiter gehen und wp-login.php vollständig ersetzen, indem Sie Benutzer auf Ihre benutzerdefinierte Anmeldeseite umleiten und diese Seite auch für die Umleitung login_failed verwenden. Vollständiger Code:

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

Passen Sie diese an und fügen Sie sie hinzu, um Ihr Logo zur wp-Login-Seite für die Passwortwiederherstellung hinzuzufügen:

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

BEARBEITEN: Ich habe dies gerade auf einem anderen Site-Formular-Scratch implementiert und festgestellt, dass der obige "Schritt weiter" vollständiger ist und kleine Syntaxfehler in "add_actions" behoben wurden. Einige Kommentare und eine Methode zum automatischen Hinzufügen des Anmeldeformulars zur Anmeldeseite ohne separate Vorlagendatei wurden hinzugefügt. Die Anmeldeformularmethode sollte in den meisten Fällen funktionieren, da sie an "the_content" angehängt ist. Wenn die Anmeldeseite mehr als eine Schleife enthält, kann dies zu Problemen führen. Verwenden Sie in diesem Fall einfach eine page-login.php-Vorlage.

Jake
quelle
1
Danke, ich werde mir das ansehen (und sehen, ob ich es in Verbindung mit einem Login von Drittanbietern wie Twitter und FB zum Laufen bringen kann)
Steven,
1
Jake - das ist eine schöne Komplettlösung. Danke für das Teilen. +1
Henrywright
Dies ist im Grunde genommen ein Plugin namens Sewn In Template Login, ein ziemlich komplettes, kleines Plugin. wordpress.org/plugins/sewn-in-template-log-in
Jake
Nizza, das einzige Problem ist, dass es keine Fehler im Front-End
auslöst
4

Als Lösung für Szczepan Hołyszewskis Hinweis auf leere Felder in der akzeptierten Lösung verhindert die folgende jQuery, dass die Standard-WP-Anmeldeseite aufgerufen wird: (zur Anmeldeseitenvorlage oder footer.php hinzufügen)

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
quelle
0

Eine Ergänzung zu Alexeys Antwort. Sie können eine Abfragefunktion hinzufügen, um sicherzustellen, dass eines der Felder nicht leer ist. Auf diese Weise wird das Formular nur gesendet, wenn es etwas zu überprüfen gibt, was verhindert, dass WordPress zu /wp-login.php umleitet.

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

Ich bin mir immer noch nicht sicher, wie ich den Aspekt des vergessenen Passworts beheben soll

user28022
quelle
3
Bitte beachten Sie, dass WordPress jQuery im "No Conflict" -Modus lädt. Der $Alias ​​funktioniert nicht.
s_ha_dum
Sie müssen auch berücksichtigen, dass der Benutzer die Eingabetaste drückt und nicht auf die Anmeldeschaltfläche klickt. Außerdem müssen Sie auch nach leeren Passwörtern suchen.
Steven
-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;
});
farhan
quelle
Bitte bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu: Warum könnte dies das Problem lösen?
fuxia