Come effettuare il logout di un utente con wp_logout?

1 mag 2015, 20:38:59
Visualizzazioni: 20.9K
Voti: 2

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()
3
Commenti

Dove/come stai utilizzando wp_logout()? Per favore posta il codice.

s_ha_dum s_ha_dum
1 mag 2015 20:46:17

Hai praticamente già risposto da solo alla tua domanda - devi chiamare wp_logout prima che qualsiasi contenuto venga inviato al browser.

Milo Milo
1 mag 2015 23:55:23

Forse delete_user_meta($user_id, 'session_tokens'); può aiutare? Questo può anche bannare uno specifico utente. Una volta che la sessione dell'utente è stata eliminata e quell'utente (o anche il tuo utente) ricarica la pagina, verrà automaticamente disconnesso da WordPress.

vee vee
24 dic 2023 16:10:37
Tutte le risposte alla domanda 2
1

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.

31 gen 2016 11:34:05
Commenti

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

itinerant itinerant
10 feb 2023 18:52:17
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()
5 mag 2015 16:58:47