Yanlış şifre girdikten sonra kullanıcıyı nasıl yönlendirebilirim?


16

wp_login_form()Giriş formunu bir jQuery iletişim penceresinde görüntülemek için kullanıyorum .

Kullanıcı yanlış şifre girerse, kullanıcı arka uca alınır. Bunu istemiyorum. Kullanıcıya yanlış şifre girdiğini ve aynı sayfada kaldığını bildirmenin bir yolu var mı?

Gelmeden önce wp_login_form()bir eklenti kullanıyordum. Bunun için bir eklenti kullanmaktan kaçınabileceğimi umuyorum.

Kodum:

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

Yanıtlar:



26

Buraya google'dan geldim. Ama cevap beni tatmin etmedi. Bir süre arıyordum ve daha iyi bir çözüm buldum.

Bunu işlevlerinize ekleyin. 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;
   }
}

Teşekkürler Alexey, bunu test edeceğim (hala bir eklenti kullandığım için)
Steven

7
Alexey'nin çözümü yanlış kimlik bilgileri girildiğinde çalışır, ancak kullanıcı kullanıcı adı veya şifre girmeyi unuttuğunda maalesef başarısız olur. Görünüşe göre Wordpress bu durumda kullanıcıyı günlüğe kaydetmeye bile çalışmaz, bu nedenle wp_login_failed eylemi gerçekleştirilmez.
Szczepan Hołyszewski

Burada biraz zaman kazanmak için wp_get_referer () kullanırdım: codex.wordpress.org/Function_Reference/wp_get_referer
Jake

1
Ayrıca, kesinlikle add_query_arg kullanıyorsunuz, bu yüzden wp_redirect şöyle olmalıdır: "wp_redirect (add_query_arg ('login', 'başarısız', $ yönlendiren));"
Jake

18

Burada özetlenen tüm sorunları ele almak için kullandığım mevcut yöntem, boş kullanıcı adı / şifre ile bile harika çalışıyor ve javascript'e güvenmiyor (js bununla birlikte iyi olabilir).

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

Anahtar, boş bir kullanıcı adı / şifrenin işlenme şeklini değiştirmek için bu filtredir:

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

Bunu bir adım daha ileri taşıyabilir ve kullanıcıları özel giriş sayfanıza yönlendirerek wp-login.php dosyasını tamamen değiştirebilir ve bu sayfayı login_failed yönlendirmesi için de kullanabilirsiniz. Tam kod:

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

Parolanızı kurtarmak için logonuzu wp-login sayfasına eklemek için bunları özelleştirin ve ekleyin:

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

Giriş logosu 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;
}

DÜZENLEME: Ben sadece başka bir site formu çizik üzerinde uyguladı ve yukarıdaki "adım daha" daha eksiksiz bulundu ve "add_actions" küçük sözdizimi hataları düzeltildi. Ayrı bir şablon dosyası olmadan giriş sayfasını otomatik olarak giriş sayfasına eklemek için bazı yorumlar ve bir yöntem eklendi. Giriş formu yöntemi çoğu durumda çalışmalıdır, "the_content" öğesine eklenmiş olduğundan, giriş sayfasında birden fazla döngü varsa, bu durumda bir page-login.php şablonu kullanın.


1
Teşekkürler, buna bir göz atacağım (ve Twitter ve FB gibi 3. taraf girişleriyle birlikte çalışıp çalışamayacağımı göreceğim)
Steven

1
Jake - bu güzel ve eksiksiz bir çözüm. Paylaşım için teşekkürler. +1
henrywright

Bu temelde oldukça eksiksiz, küçük bir eklenti olan Sewn In Template Login adlı bir eklentiye sarılmıştır. wordpress.org/plugins/sewn-in-template-log-in
Jake

Güzel, tek sorun aslında ön uç hataları atmıyor ....
Siyah

4

Szczepan Hołyszewski'nin kabul edilen çözümdeki boş alanlar hakkındaki noktası için aşağıdaki jQuery, standart wp-giriş sayfasına gitmeyi engelleyecektir: (giriş sayfası şablonuna veya footer.php'ye ekle)

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

0

Alexey'in cevabına bir ek. Alanlardan birinin boş olmadığından emin olmak için bir jquery işlevi ekleyebilirsiniz. Bu şekilde, WordPress'in /wp-login.php'ye yönlendirmesini engelleyen, denetlenecek bir şey olmadığı sürece form gönderilmez.

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

Şifremi unuttum özelliğini nasıl düzeltebileceğimden hala emin değilim


3
WordPress'in jQuery'yi "Çakışma Yok" modunda yüklediğini lütfen unutmayın. $Takma çalışmaz.
s_ha_dum

Ayrıca, kullanıcının [enter] tuşuna bastığını ve oturum açma düğmesine tıklamamasını da göz önünde bulundurmalısınız. Ayrıca, boş parola da kontrol etmeniz gerekir.
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;
});

Lütfen yanıtınızı düzenleyin ve bir açıklama ekleyin: bu sorunu neden çözebilir?
fuxia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.