wp_signon() nu autentifică utilizatorul - ghid necesar

24 sept. 2013, 20:40:45
Vizualizări: 25.3K
Voturi: 7

Folosesc un formular pentru a trimite o cerere POST către o pagină și pentru a autentifica utilizatorul cu wp_signon() pentru a-l autentifica în instalarea mea WordPress așa cum este descris în documentația WP:

$creds = array();
$creds['user_login'] = $_POST["user-login"];
$creds['user_password'] = $_POST["user-password"];
$creds['remember'] = true;

$user = wp_signon( $creds, false );

După acest mic fragment de cod, verific dacă utilizatorul a fost autentificat:

if ( is_user_logged_in() ) { echo "SUCCES"; } else { echo "EȘUAT!"; }

Dar primesc mereu EȘUAT!. Apoi, după ce am investigat, am găsit acest mic truc:

wp_set_current_user( $user );
if ( is_user_logged_in() ) { echo "SUCCES"; } else { echo "EȘUAT!"; }

Am primit SUCCES la acesta, dar când părăsesc această pagină primesc din nou și din nou EȘUAT.

Poate cineva să-mi explice cum să autentific utilizatorul cu wp_signon() fără ca acesta să fie deconectat după ce pagina este schimbată sau reîncărcată sau orice altceva.


Am obținut rezultatul dorit când merg la /wp_admin și mă autentific cu formularul implicit de login WordPress. Pot naviga prin fiecare pagină a site-ului meu WP rămânând autentificat tot timpul. Dar când încerc să fac acest lucru în afara formularului implicit, primesc EȘUAT.

Ajutați-mă! VĂ ROG!

11
Comentarii

site-ul tău are SSL, adică schema URL a site-ului tău este http sau https??

Anjum Anjum
24 sept. 2013 21:26:34

@Anjum de fapt eu îl stochez pe localhost cu MAMP... deci răspunsul meu este Nu știu ))

LoomyBear LoomyBear
24 sept. 2013 21:44:18

poți să-mi spui cum accesezi pagina de login, adică URL-ul paginii de login, http://localhost/login-page/ sau https://localhost/login-page/ ?

Anjum Anjum
24 sept. 2013 21:47:33

te rog postează aici codul tău pentru formularul personalizat de login, așadar ..

Anjum Anjum
24 sept. 2013 21:49:18

@Anjum Eu folosesc doar http://localhost:8888/registration/ dar dacă încerci să sugerezi wp_signon( $user, secure:true/false ) am încercat ambele variante și nu a funcționat. Oricum mulțumesc.

LoomyBear LoomyBear
24 sept. 2013 21:54:14

postează aici codul paginii tale de înregistrare ca să-ți pot rezolva problema

Anjum Anjum
24 sept. 2013 22:01:15

@Anjum Iată-l pe pastebin

LoomyBear LoomyBear
24 sept. 2013 22:17:56

codul formularului html nu a fost găsit în codul tău

Anjum Anjum
24 sept. 2013 22:25:36

@Anjum îmi pare rău pentru asta ... Am actualizat pastebin te rog verifică

LoomyBear LoomyBear
24 sept. 2013 22:31:12

nu ai un câmp pentru autentificare utilizator în formularul tău, adaugă un input de tip text numit user-login și folosește <?php the_permalink(); ?> în atributul action al formularului în loc de <? echo get_permalink( get_page_by_path('registration') ); ?>

Anjum Anjum
24 sept. 2013 22:35:02

@Anjum după cum poți vedea pe pastebin $user_login și $user_email sunt același lucru $_POST["user_email"] iar în ceea ce privește acțiunea formularului, este doar permalink-ul către aceeași pagină, deci se auto-apelează.

LoomyBear LoomyBear
24 sept. 2013 22:38:23
Arată celelalte 6 comentarii
Toate răspunsurile la întrebare 2
7

În sfârșit, acest cod funcționează pentru mine pe instalarea locală de WordPress, după ce am înlocuit caracterele "-" cu "_" în numele atributelor din input și am folosit etichetele complete de început PHP <?php în loc de <?. Codul final este aici, copiați și lipiți-l în template-ul vostru.

<?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'
);

// Inserare utilizator nou în baza de date
//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 'SUCCES'; ?>
<h1>Html pentru utilizator autentificat </h1>
<?php else : echo 'EȘUAT!'; ?>
<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="Parolă" /></p>
    <p><input type="submit" class="button blue size-s" value="Trimite" /></p>
</form>
<?php endif; ?>
24 sept. 2013 22:52:33
Comentarii

Te ține autentificat când mergi pe o pagină diferită de cea cu formularul? unde este setat wp_set_current_user();?

LoomyBear LoomyBear
24 sept. 2013 23:01:13

da, funcționează bine pentru mine, verifică setările de cookie-uri din browserul tău

Anjum Anjum
24 sept. 2013 23:32:37

Am verificat cookie-urile în toate browserele. Sunt activate peste tot. Când folosesc acest cod, autentifică utilizatorul doar când formularul trimite o cerere POST. Când pagina este reîncărcată fără a trimite nimic, nimeni nu este autentificat. Am încercat global $current_user; var_dump($current_user); și am obținut informațiile utilizatorului doar când POST era trimis, altfel returnează object(WP_User)#206 (7) { ["data"]=> NULL ["ID"]=> int(0) ...

LoomyBear LoomyBear
24 sept. 2013 23:48:09

de asemenea, când mă autentific prin formularul standard WP de login cu același utilizator, am variabila $current_user afișată corect în ambele cazuri. Ce este în neregulă cu mine??!!

LoomyBear LoomyBear
24 sept. 2013 23:49:58

apelezi atât wp_insert_user() cât și wp_signon() la fiecare cerere? dacă da, încearcă să comentezi wp_insert_user() și apoi să te autentifici pentru a vedea rezultatul.

Anjum Anjum
25 sept. 2013 00:03:36

am pus fișierele template pe serverul remote și funcționează. Îmi pare rău că v-am deranjat atât de mult... a fost greșeala mea toată această perioadă. Se pare că wp_signon(); funcționează conform așteptărilor

LoomyBear LoomyBear
25 sept. 2013 00:05:31

cred că problema este în instalarea ta de WordPress, încearcă să o reinstalezi pe serverul local.

Anjum Anjum
25 sept. 2013 00:17:29
Arată celelalte 2 comentarii
0

Dacă parola ta include caracterele # și/sau @, trebuie să utilizezi urlencode înainte de a trimite în formular, apoi urldecode înainte de a seta credentialele în wp_signon.

Codificarea URL pentru @ este %40, pentru # este %23, iar pentru ! este %21

Dacă parola ta este mY!p@ssWord#, atunci trebuie să fie codificată URL înainte de a fi trimisă POST către mY%21p%40ssWord%23, apoi decodificată URL înainte de a seta credentialele pentru wp_signon

20 iun. 2019 08:12:47