wp_signon() non autentica l'utente - guida necessaria
Uso un form per inviare una richiesta POST a una pagina e per autenticare l'utente con wp_signon() nel mio WordPress come descritto nella documentazione WP:
$creds = array();
$creds['user_login'] = $_POST["user-login"];
$creds['user_password'] = $_POST["user-password"];
$creds['remember'] = true;
$user = wp_signon( $creds, false );
Dopo questo piccolo pezzo di codice controllo se l'utente è stato autenticato:
if ( is_user_logged_in() ) { echo "SUCCESS"; } else { echo "FAIL!"; }
Ma ottengo sempre FAIL!. Poi dopo aver investigato ho trovato questo piccolo trucco:
wp_set_current_user( $user );
if ( is_user_logged_in() ) { echo "SUCCESS"; } else { echo "FAIL!"; }
Ho ottenuto SUCCESS con questo, ma quando lascio questa pagina ottengo di nuovo FAIL ripetutamente.
Qualcuno può spiegarmi come effettuare il login dell'utente con wp_signon() senza che venga disconnesso dopo che la pagina viene cambiata o ricaricata o altro.
Ho ottenuto il risultato desiderato quando vado su /wp_admin e accedo con il form di login predefinito di WP. Posso navigare attraverso ogni pagina del mio sito WP rimanendo connesso tutto il tempo. Ma quando provo a farlo al di fuori del form predefinito ottengo FAIL.
Ho bisogno di una guida! PER FAVORE!
Finalmente questo codice funziona per me nella mia installazione locale di WordPress dopo aver sostituito i trattini - con underscore _ nel nome dell'attributo input e utilizzando i tag PHP completi <?php invece di <?. Ecco il codice finale da copiare e incollare nel tuo template.
<?php if ( isset($_POST["user_email"]) && isset($_POST["user_password"]) ) {
$user_login = esc_attr($_POST["user_email"]);
$user_password = esc_attr($_POST["user_password"]);
$user_email = esc_attr($_POST["user_email"]);
$user_data = array(
'user_login' => $user_login,
'user_pass' => $user_password,
'user_email' => $user_email,
'role' => 'student'
);
// Inserimento del nuovo utente nel database
//wp_insert_user( $user_data );
$creds = array();
$creds['user_login'] = $user_login;
$creds['user_password'] = $user_password;
$creds['remember'] = true;
$user = wp_signon( $creds, false );
$userID = $user->ID;
wp_set_current_user( $userID, $user_login );
wp_set_auth_cookie( $userID, true, false );
do_action( 'wp_login', $user_login );
}
if ( is_user_logged_in() ) : echo 'SUCCESSO'; ?>
<h1>Html per utente loggato </h1>
<?php else : echo 'FALLITO!'; ?>
<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" class="button blue size-s" value="Invia" /></p>
</form>
<?php endif; ?>
Ti mantiene loggato quando vai a una pagina diversa da quella con il form? dove è impostato wp_set_current_user();?
LoomyBear
sì, funziona bene per me, controlla le impostazioni dei cookie del tuo browser
Anjum
Ho controllato i cookie in tutti i browser. Sono abilitati ovunque. Quando uso questo codice l'utente viene loggato solo quando il form invia una richiesta POST. Quando la pagina viene ricaricata senza inviare nulla a se stessa nessuno rimane loggato. Ho provato global $current_user; var_dump($current_user); e ho ottenuto le informazioni dell'utente solo quando veniva inviato il POST altrimenti restituisce object(WP_User)#206 (7) { ["data"]=> NULL ["ID"]=> int(0) ...
LoomyBear
inoltre quando accedo tramite il modulo di login predefinito di WP con lo stesso utente, ottengo $current_user var_dumpato correttamente in entrambi i casi. Cosa c'è che non va in me??!!
LoomyBear
stai chiamando sia wp_insert_user() che wp_signon() ad ogni richiesta? Se sì, prova a commentare wp_insert_user() e poi effettua il login per vedere il risultato.
Anjum
ho messo i file template sul server remoto e funziona. Scusa per averti disturbato così a lungo... era colpa mia fin dall'inizio. Sembra che wp_signon(); funzioni come previsto
LoomyBear
Se la tua password include i caratteri # e/o @, devi applicare l'urlencode prima di inviarla nel form, e poi l'urldecode prima di impostare le credenziali in wp_signon.
La codifica URL per @ è %40, # è %23 e ! è %21
Se la tua password è mY!p@ssWord# dovrebbe essere codificata in URL prima di inviarla come mY%21p%40ssWord%23, poi decodificata in URL prima di impostare le credenziali per wp_signon