Cum deconectezi un utilizator folosind wp_logout?
Pot face wp_logout
să funcționeze, dar nu fără a genera multe avertismente ('PHP warning: Cannot modify header information - headers already sent').
wp_logout
apelează wp_clear_auth_cookie
, care la rândul său apelează setcookie
, iar cookie-urile trebuie să meargă împreună cu header-ele HTTP. Apelez wp_logout
în interiorul paginii (în header sau footer), de aici apare problema.
Deci, cum ar trebui să deconectez programatic un utilizator? Aș putea face asta ca răspuns la o cerere ajax, dar pare mult prea complicat. Mulțumesc.
EDITARE
Codul actual este următorul:
add_action('wp_footer', 'fp_onload_php2');
function fp_onload_php2() {
$slug = basename(get_permalink());
if($slug != 'club-login')
return;
$jsmsg = '';
$loggedin = false;
if(is_user_logged_in()) {
$current_user = wp_get_current_user();
$loggedin = $current_user->has_cap('customer');
}
if($loggedin && isset($_GET['logout'])) {
wp_logout();
$jsmsg = 'Ai fost deconectat.';
$loggedin = false;
} else if(!$loggedin && isset($_GET['logout']))
$jsmsg = "Nu ești conectat.";
if(!$loggedin)
echo
"<script type='text/javascript'> fp_onload_js2(0, '" . $jsmsg .
"'); </script>\n";
else
echo
"<script type='text/javascript'> fp_onload_js2(1, '" . $jsmsg .
"'); </script>\n";
} // fp_onload_php2()
Dacă folosești wp_logout
în propriul tău cod, cel mai bine este să folosești exit
sau wp_redirect
imediat după aceea.
Poți apela wp_set_current_user(0)
după wp_logout()
pentru a deconecta manual utilizatorul instantaneu, dacă trebuie să continui execuția PHP dar nu dorești ca utilizatorul să rămână autentificat.

Începând cu WP 5.3, problema 35488 a fost rezolvată, iar wp_logout() include acum wp_set_current_user(0)

Acest lucru nu este ideal, dar pare să funcționeze. Nu este atât de simplu precum apelarea wp_logout
înainte ca orice conținut să fie trimis, deoarece utilizatorul poate fi sau nu deconectat înainte ca restul paginii să se încarce (nu înțeleg acest aspect). În cazul meu, conținutul paginii depinde de faptul dacă utilizatorul este sau nu autentificat (meniurile se schimbă, iar unele coduri JS sunt apelate pentru a afișa conținutul diferit).
Pentru acest cod, o cerere de deconectare redirecționează către pagina de autentificare, cu un parametru GET logout=1
. Acest lucru este testat pe pagina de autentificare, care apoi apelează wp_logout
și redirecționează înapoi către pagina de autentificare cu un parametru GET logout=0
, pentru a forța o reîmprospătare.
add_action('init', 'check_logout');
function check_logout() {
if(!isset($_GET['logout']) || ($_GET['logout'] != '1'))
return;
// get_permalink() și $post nu sunt disponibile aici, deci:
$path = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
if($path != "/login/")
return;
if(is_user_logged_in()) {
wp_logout();
header("Location: http://fubar.com/login/?logout=0");
exit();
}
} // check_logout()
