Cum deconectezi un utilizator folosind wp_logout?

1 mai 2015, 20:38:59
Vizualizări: 20.9K
Voturi: 2

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

Unde/cum folosești wp_logout()? Postează codul te rog.

s_ha_dum s_ha_dum
1 mai 2015 20:46:17

deja ți-ai răspuns singur la întrebare - trebuie să apelezi wp_logout înainte ca orice conținut să fie trimis către browser.

Milo Milo
1 mai 2015 23:55:23

Poate delete_user_meta($user_id, 'session_tokens'); poate ajuta? Acest lucru poate și interzice un anumit utilizator. Odată ce sesiunea utilizatorului a fost ștearsă și acel utilizator (sau chiar tu) reîmprospătează pagina, va fi deconectat automat de WordPress.

vee vee
24 dec. 2023 16:10:37
Toate răspunsurile la întrebare 2
1

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.

31 ian. 2016 11:34:05
Comentarii

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

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