Cum pot redirecționa utilizatorul după introducerea parolei greșite?

26 apr. 2011, 17:07:13
Vizualizări: 65.1K
Voturi: 23

Folosesc wp_login_form() pentru a afișa formularul de autentificare într-o fereastră de dialog jQuery.

Dacă utilizatorul introduce parola greșită, este redirecționat către backend. Nu vreau acest lucru. Există vreo modalitate de a notifica utilizatorul că a introdus parola greșită și să rămână pe aceeași pagină?

Înainte de apariția wp_login_form() foloseam un plugin. Sper să pot evita utilizarea unui plugin pentru această funcționalitate.

Codul meu:

wp_login_form( array(
  'label_remember' => __( 'Ține-mă minte' ),
  'label_log_in' => __( 'Autentificare' )
) );
0
Toate răspunsurile la întrebare 9
4
34

Am ajuns aici de pe Google. Dar răspunsul nu m-a mulțumit. Am căutat mai departe și am găsit o soluție mai bună.

Adaugă acest cod în fișierul tău functions.php:

add_action( 'wp_login_failed', 'my_front_end_login_fail' );  // acțiune pentru autentificarea eșuată

function my_front_end_login_fail( $username ) {
   $referrer = $_SERVER['HTTP_REFERER'];  // de unde vine încercarea de autentificare?
   // dacă există un referrer valid și nu este pagina implicită de logare
   if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') ) {
      wp_redirect( $referrer . '?login=failed' );  // adăugăm un parametru (login=failed) în URL pentru temă
      exit;
   }
}
9 iun. 2012 00:06:53
Comentarii

Mulțumesc Alexey, voi testa această soluție (deoarece încă folosesc un plugin)

Steven Steven
20 iun. 2012 02:29:54

Soluția lui Alexey funcționează când sunt introduse credențiale greșite, dar din păcate eșuează când utilizatorul uită să introducă numele de utilizator sau parola. Se pare că WordPress nici măcar nu încearcă să autentifice utilizatorul în acest caz, așa că acțiunea wp_login_failed nu este executată.

Szczepan Hołyszewski Szczepan Hołyszewski
12 sept. 2012 10:39:23

Aș folosi wp_get_referer() aici pentru a economisi timp: http://codex.wordpress.org/Function_Reference/wp_get_referer

Jake Jake
3 iul. 2013 20:00:49

De asemenea, cu siguranță folosești add_query_arg aici, așa că wp_redirect ar trebui să fie: "wp_redirect( add_query_arg('login', 'failed', $referrer) );"

Jake Jake
3 iul. 2013 20:14:24
4
25

Metoda pe care o folosesc în prezent pentru a rezolva toate problemele prezentate aici funcționează excelent chiar și cu nume de utilizator/parolă goale și nu se bazează pe javascript (deși js ar putea fi util împreună cu aceasta).

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

Cheia este acest filtru pentru a schimba modul în care este tratat un nume de utilizator/parolă gol:

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>EROARE</strong>: Nume de utilizator invalid sau parolă incorectă.'));

        return $error;
    }
}

Puteți merge un pas mai departe și puteți înlocui complet wp-login.php prin redirecționarea utilizatorilor către pagina dumneavoastră personalizată de autentificare și folosirea acelei pagini și pentru redirecționarea login_failed. Codul complet:

/**
 * Acțiuni pentru Pagina Personalizată de Autentificare
 */
// Schimbă URL-ul de autentificare pe tot site-ul către pagina personalizată
add_filter( 'login_url', 'custom_login_url', 10, 2 );
// Redirecționează wp-login către autentificarea personalizată cu niște variabile de interogare personalizate atunci când este necesar
add_action( 'login_head', 'custom_redirect_login', 10, 2 );
// Actualizează eșecul autentificării pentru a trimite utilizatorul înapoi la formularul personalizat cu o variabilă de interogare
add_action( 'wp_login_failed', 'custom_login_failed', 10, 2 );
// Actualizează autentificarea pentru a returna o eroare atunci când un câmp sau ambele sunt goale
add_filter( 'authenticate', 'custom_authenticate_username_password', 30, 3);
// Adaugă automat formularul de autentificare la pagina "login"
add_filter( 'the_content', 'custom_login_form_to_login_page' );

/**
 * Funcții pentru Pagina Personalizată de Autentificare
 */
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>EROARE</strong>: Nume de utilizator invalid sau parolă incorectă.'));

        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 = "A apărut o problemă cu numele de utilizator sau parola.";
            elseif ( 'loggedout' == $_GET['action'] )
                $message = "Acum sunteți deconectat.";
            elseif ( 'recovered' == $_GET['action'] )
                $message = "Verificați e-mailul pentru link-ul de confirmare.";
        }

        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="Recuperare Parolă Pierdută">Ai uitat parola?</a>';

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

Personalizați și adăugați acestea pentru a adăuga logo-ul dumneavoastră pe pagina wp-login pentru recuperarea parolei:

// apelat doar pe pagina de autentificare
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 ); }
// schimbă link-ul logo-ului de la wordpress.org către site-ul dumneavoastră
add_filter( 'login_headerurl', 'custom_login_logo_url' );
function custom_login_logo_url() { return home_url(); }
// schimbă textul alternativ al logo-ului pentru a afișa numele site-ului
add_filter( 'login_headertitle', 'custom_login_title' );
function custom_login_title() { return get_option('blogname'); }

CSS pentru logo-ul de autentificare:

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

EDITARE: Tocmai am implementat acest lucru pe un alt site de la zero și am descoperit că "pasul înainte" de mai sus este mai complet și am corectat mici erori de sintaxă în "add_actions". Am adăugat câteva comentarii și o metodă pentru a adăuga automat formularul de autentificare la pagina de login fără un fișier șablon separat. Metoda cu formularul de autentificare ar trebui să funcționeze în majoritatea cazurilor, deoarece este atașată la "the_content", ar putea cauza o problemă dacă aveți mai mult de o buclă pe pagina de autentificare, folosiți în acel caz un șablon page-login.php.

3 iul. 2013 21:11:07
Comentarii

Mulțumesc, voi analiza acest lucru (și voi încerca să-l fac să funcționeze împreună cu autentificarea prin terți precum Twitter și Facebook)

Steven Steven
4 iul. 2013 00:15:12

Jake - aceasta este o soluție completă și elegantă. Mulțumesc pentru share. +1

henrywright henrywright
30 sept. 2013 00:39:16

Această funcționalitate este practic integrată într-un plugin numit Sewn In Template Login, un mic plugin destul de complet. https://wordpress.org/plugins/sewn-in-template-log-in/

Jake Jake
31 ian. 2016 00:05:34

Grozav, singura problemă este că nu afișează erori în partea de front-end....

Siyah Siyah
9 mai 2019 11:43:49
0

wp_login_form() creează un formular cu un atribut action setat la site_url/wp-login.php, ceea ce înseamnă că atunci când apăsați butonul de trimitere, formularul este postat către site_url/wp-login.php care ignoră redirect_to în caz de erori (cum ar fi parola greșită). Deci, în cazul dvs., fie reveniți la utilizarea unui plugin, fie recreați întregul proces de autentificare și astfel veți avea control asupra erorilor. Consultați Verificarea numelui de utilizator corect pe formularul personalizat de autentificare care este o întrebare foarte similară.

26 apr. 2011 18:53:25
0

O soluție pentru observația lui Szczepan Hołyszewski referitoare la câmpurile goale în soluția acceptată, următorul cod jQuery va împiedica accesul la pagina standard wp-login: (adaugați în template-ul paginii de login sau în 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;
});
9 mai 2013 23:57:17
0

Următoarele au funcționat pentru mine. Ambele cârlige pot fi găsite în funcția wp_authenticate din wp-includes/puggabel.php.

  1. Verifică prin filtrul authenticate dacă formularul de login lipsește numele de utilizator sau parola.
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);
  1. Verifică prin acțiunea wp_login_failed dacă autentificarea cu numele de utilizator și parola furnizate a eșuat.
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);
30 aug. 2020 17:12:08
2

O completare la răspunsul lui Alexey. Puteți adăuga o funcție jQuery pentru a verifica dacă cel puțin unul dintre câmpuri nu este gol. Astfel, formularul nu va fi trimis decât dacă există ceva de verificat, prevenind redirecționarea WordPress către /wp-login.php.

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

Încă nu sunt sigur cum să rezolv problema cu resetarea parolei.

26 feb. 2013 07:09:33
Comentarii

Te rugăm să fii conștient că WordPress încarcă jQuery în modul "No Conflict". Aliasul $ nu funcționează.

s_ha_dum s_ha_dum
26 feb. 2013 07:38:10

De asemenea, trebuie să iei în considerare că utilizatorul poate apăsa [enter] și nu să dea click pe butonul de login. De asemenea, trebuie să verifici și pentru parola goală.

Steven Steven
26 feb. 2013 13:07:41
0

Adaug la răspunsul util al lui @alexey și ofer o soluție pentru problema menționată de alții.

Codul său care trebuie introdus în fișierul functions.php:

add_action( 'wp_login_failed', 'my_front_end_login_fail' );  // conectează eșecul autentificării

function my_front_end_login_fail( $username ) {
   $referrer = $_SERVER['HTTP_REFERER'];  // de unde provine încercarea de autentificare?
   // dacă există un referrer valid și nu este pagina implicită de autentificare
   if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') ) {
      wp_redirect( $referrer . '?login=failed' );  // adaugă un parametru (login=failed) în URL pentru a fi folosit de temă
      exit;
   }
}

Totuși, după cum au menționat și alții, dacă câmpurile sunt goale, WordPress nu validează și utilizatorii ajung tot pe pagina de autentificare din backend.

Pentru a rezolva această problemă, adaug un script imediat după crearea formularului care adaugă atributul required câmpurilor, astfel încât browserul să oprească trimiterea dacă acestea sunt goale.

Pe pagina unde se află formularul tău:

<?php 
$args = array(
    'form_id' => 'NUMELE-FORMULARULUI-TĂU',
); 
wp_login_form( $args );
?>
<script>
if(jQuery('form#NUMELE-FORMULARULUI-TĂU').length) { 
    jQuery('form#NUMELE-FORMULARULUI-TĂU input').each(function() {
        jQuery(this).attr("required", true);
    });
}
</script>
3 mai 2023 19:28:20
0

Voiam doar ca în caz de autentificare eșuată (sau câmp gol), utilizatorul să rămână pe aceeași pagină, cu mesajul de eroare. Am încercat codul de mai sus dar sunt mai multe erori... ai găsit o cale mai ușoară de a face asta? Mulțumesc

31 ian. 2025 15:00:33
1
-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;
});
11 mai 2018 15:20:30
Comentarii

Te rog să [editezi] răspunsul tău și să adaugi o explicație: de ce ar putea rezolva aceasta problema?

fuxia fuxia
11 mai 2018 16:06:17