wp_signon() nu autentifică utilizatorul - ghid necesar
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!

Î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; ?>

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

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

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) ...

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??!!

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.

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

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
