wp_signon() non autentica l'utente - guida necessaria

24 set 2013, 20:40:45
Visualizzazioni: 25.3K
Voti: 7

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!

11
Commenti

il tuo sito ha SSL, intendo lo schema dell'URL del tuo sito è http o https??

Anjum Anjum
24 set 2013 21:26:34

@Anjum in realtà lo memorizzo sul mio localhost con MAMP... quindi la mia risposta è non lo so ))

LoomyBear LoomyBear
24 set 2013 21:44:18

puoi dirmi come accedi alla tua pagina di login, intendo l'URL della tua pagina di login, http://localhost/login-page/ o https://localhost/login-page/ ?

Anjum Anjum
24 set 2013 21:47:33

per favore pubblica qui il codice del tuo modulo di login personalizzato, così...

Anjum Anjum
24 set 2013 21:49:18

@Anjum uso semplicemente http://localhost:8888/registration/ ma se stai suggerendo di provare wp_signon( $user, secure:true/false ) l'ho già provato entrambi e non ha funzionato. Comunque grazie.

LoomyBear LoomyBear
24 set 2013 21:54:14

pubblica qui il codice della tua pagina di registrazione così posso risolvere il tuo problema

Anjum Anjum
24 set 2013 22:01:15

@Anjum Eccolo su pastebin

LoomyBear LoomyBear
24 set 2013 22:17:56

codice html del form non trovato nel tuo codice

Anjum Anjum
24 set 2013 22:25:36

@Anjum scusa per questo... ho aggiornato il pastebin per favore controlla

LoomyBear LoomyBear
24 set 2013 22:31:12

non hai il campo user-login nel tuo form, aggiungi un input di testo con nome user-login e usa anche <?php the_permalink(); ?> nell'attributo action del form invece di <? echo get_permalink( get_page_by_path('registration') ); ?>

Anjum Anjum
24 set 2013 22:35:02

@Anjum come puoi vedere sul pastebin $user_login e $user_email sono lo stesso $_POST["user_email"] e riguardo all'action del form è semplicemente il permalink alla stessa pagina quindi agisce su se stessa.

LoomyBear LoomyBear
24 set 2013 22:38:23
Mostra i restanti 6 commenti
Tutte le risposte alla domanda 2
7

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; ?>
24 set 2013 22:52:33
Commenti

Ti mantiene loggato quando vai a una pagina diversa da quella con il form? dove è impostato wp_set_current_user();?

LoomyBear LoomyBear
24 set 2013 23:01:13

sì, funziona bene per me, controlla le impostazioni dei cookie del tuo browser

Anjum Anjum
24 set 2013 23:32:37

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 LoomyBear
24 set 2013 23:48:09

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 LoomyBear
24 set 2013 23:49:58

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 Anjum
25 set 2013 00:03:36

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 LoomyBear
25 set 2013 00:05:31

Penso che il problema sia nella tua installazione di WordPress, prova a reinstallarlo sul tuo server locale.

Anjum Anjum
25 set 2013 00:17:29
Mostra i restanti 2 commenti
0

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

20 giu 2019 08:12:47