2015-06-26 14 views
12

Ho creato il modello per l'accesso con l'aiuto della funzione wp_login_form(). Ora Se l'utente immettere una password errata o nome utente mi reindirizzerà alla stessa pagina con l'argomento login=failed con il seguente codice:come recuperare l'errore di wp nel modulo di login personalizzato

add_action('wp_login_failed', 'front_end_login_fail'); 
function front_end_login_fail($username) { 

$_SESSION['uname'] = $username; 
// Getting URL of the login page 
$referrer = $_SERVER['HTTP_REFERER'];  
$login_failed_error_codes = array('empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password'); 

// 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(get_permalink(93) . "?login=failed"); 
    exit; 
} 

} 

SOCIETÀ Questa funzione è ok, ma ora come per wordpress funzionalità che forniscono come segue:

utente 1. Se entrare vero nome utente ma sbagliato la password verrà visualizzato l'errore come "incorrect_password"

utente 2. Se entrare falsa nome utente ma vero la password verrà visualizzato l'errore come "invalid_username"

utente 3. Se entrare sbagliato nome utente ma sbagliato la password verrà visualizzato l'errore come "invalidcombo"

Aggiungere quindi si prega di controllare variabili $ login_failed_error_codes in codice ... Ho fatto qualche ricerca. Ho ottenuto una classe chiamata "WP_error". Ma non so come funzioni con questo codice.

Sono appena bloccato su come passare l'oggetto di WP_error da wp-login.php al mio modello csutom?

Grazie ... qualsiasi aiuto sarebbe apprezzabile.

risposta

6

Penso di capire cosa stai cercando di raggiungere. Si desidera essere in grado di visualizzare il motivo dell'accesso non riuscito sulla propria pagina di accesso personalizzata. Presumo che tu sappia già come recuperare i parametri $_GET, poiché li stai utilizzando per passare il tuo parametro login_failed.

utilizzare il filtro login_redirect invece:

add_filter('login_redirect', 'my_login_redirect', 10, 3); 
function my_login_redirect($redirect_to, $requested_redirect_to, $user) { 
    if (is_wp_error($user)) { 
     //Login failed, find out why... 
     $error_types = array_keys($user->errors); 
     //Error type seems to be empty if none of the fields are filled out 
     $error_type = 'both_empty'; 
     //Otherwise just get the first error (as far as I know there 
     //will only ever be one) 
     if (is_array($error_types) && !empty($error_types)) { 
      $error_type = $error_types[0]; 
     } 
     wp_redirect(get_permalink(93) . "?login=failed&reason=" . $error_type); 
     exit; 
    } else { 
     //Login OK - redirect to another page? 
     return home_url(); 
    } 
} 
+0

per risposta lasciami controllare – vrajesh

+0

lavorando bene..bravo, ottimo, buon lavoro THX ... !!! – vrajesh

0

Sembra following answer è quello che vi serve:

È necessario collegare in authenticate gancio wordpress. Quindi restituire un nuovo oggetto WP_Error per generare un messaggio di errore e reindirizzare nuovamente a la pagina di accesso. Ecco un esempio.

add_filter('authenticate', 'check_login_submit', 40, 3); 

function check_login_submit($user, $username, $password) { 
    $WP_Error = new WP_Error(); 
    $WP_Error->add('my_error', '<strong>Error</strong>: Something went wrong.'); 
    return $WP_Error; 
} 
+0

Thx. per risposta, ma sono solo bloccato su come passare oggetto di WP_error da wp-login.php al mio modello csutom? – vrajesh

+0

Non è necessario passare l'oggetto. Basta passare il messaggio di errore e il codice di errore. Quindi puoi creare un nuovo oggetto WP_Error come questo: '$ my_error = new WP_Error ('ErrorCode', 'ErrorMessage');' – Samuel

+0

se possibile dare un esempio. – vrajesh

0

Se sono stati creati modello personalizzato per l'accesso Allora perché non si utilizza il metodo wp_signon con l'aiuto di modulo personalizzato?. restituirà l'oggetto WP_error su false e su true restituirà $ oggetto utente.

<?php 
if(isset($_POST['submit'])){ 
     $creds = array(); 
     $creds['user_login'] = $_POST['user_email']; 
     $creds['user_password'] = $_POST['user_password']; 
     $creds['remember'] = true; 
     $user = wp_signon($creds, false); 
     if (is_wp_error($user)) 
      echo $user->get_error_message(); 
} 
?> 

<form id="user-credentials" method="post" action="<?php the_permalink(); ?>"> 
    <p><input name="user_email" type="text" placeholder="Email" /></p> 
    <p><input name="user_password" type="password" placeholder="Password" /></p> 
    <p><input type="submit" value="Submit" /></p> 
</form> 

Non ho provato ma dovrebbe funzionare.

+0

thx .. apprezza davvero il tuo sforzo. Ma ho usato la funzione wp_login_form(). – vrajesh

0
function front_end_login_fail($username) { 
$set_confirm=0; 
$_SESSION['uname'] = $username; 
/*******Check whether user entered username or email to login*********/ 
if(is_email($username)){ 
     if(email_exists($username)) { 
      $uid = email_exists($username); 
      $confirm_mail =get_user_meta($uid,'confirm_mail',true); 
      if($confirm_mail!=1){ 
       $set_confirm=1; 
      } 
     } 
    //$user_check = get_user_by('email', $username); 
    //print_r($user_check); 

}else{ 

    if (username_exists($username)){ 
     $uid = username_exists($username); 
      $confirm_mail =get_user_meta($uid,'confirm_mail',true); 
      if($confirm_mail!=1){ 
       $set_confirm=1; 
      }  
    } 
} 
    //$user_check = get_user_by('user_login ', $username); 
    //print_r($user_check); 

// Getting URL of the login page 
$referrer = $_SERVER['HTTP_REFERER'];  


// 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(get_permalink(93) . "?login=failed&confirm_email=".$set_confirm); 
    exit; 
} 

} 
add_action('wp_login_failed', 'front_end_login_fail'); 
+0

Questa porzione di codice determina "se l'utente ha immesso il nome utente o l'e-mail per l'accesso", quindi inserisce "& confirm_email = 1" o "0" di conseguenza ... Non risolve il problema per come passare i messaggi di errore completi allo script personalizzato . –

Problemi correlati