Come effettuare il logout di un utente con wp_logout?
Riesco a far funzionare wp_logout
, ma non senza generare molti warning ('PHP warning: Cannot modify header information - headers already sent').
wp_logout
richiama wp_clear_auth_cookie
, che a sua volta chiama setcookie
, e i cookie devono essere inviati con gli header HTTP. Sto chiamando wp_logout
all'interno della pagina (nell'header o footer), da qui il problema.
Quindi, come posso eseguire programmaticamente il logout di un utente? Potrei farlo in risposta a una richiesta ajax, ma sembra eccessivo. Grazie.
MODIFICA
Codice attuale come segue:
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 = 'Sei stato disconnesso.';
$loggedin = false;
} else if(!$loggedin && isset($_GET['logout']))
$jsmsg = "Non hai effettuato l'accesso.";
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()

Se stai utilizzando wp_logout
nel tuo codice, è probabilmente meglio eseguire exit
o wp_redirect
immediatamente dopo.
Puoi chiamare wp_set_current_user(0)
dopo wp_logout()
per disconnettere manualmente l'utente all'istante, se hai bisogno di continuare l'esecuzione del PHP ma non vuoi che l'utente rimanga connesso.

A partire da WP 5.3, dopo la correzione del problema 35488, wp_logout() include wp_set_current_user(0)

Non è l'ideale, ma sembra funzionare. Non è semplice come chiamare wp_logout
prima che qualsiasi contenuto venga inviato, perché l'utente potrebbe essere disconnesso o meno prima che il resto della pagina venga caricato (questo aspetto non mi è chiaro). Nel mio caso, i contenuti della pagina dipendono dal fatto che l'utente sia effettivamente loggato o meno (i menu cambiano e viene chiamato del codice JS per visualizzare i contenuti in modo diverso).
Per questo codice, una richiesta di logout reindirizza alla pagina di login, con un parametro GET logout=1
. Questo viene testato nella pagina di login, che poi chiama wp_logout
e reindirizza nuovamente alla pagina di login con un parametro GET logout=0
, per forzare un refresh.
add_action('init', 'check_logout');
function check_logout() {
if(!isset($_GET['logout']) || ($_GET['logout'] != '1'))
return;
// get_permalink() e $post non sono disponibili qui, quindi:
$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()
