¿Cómo cerrar la sesión de un usuario con wp_logout?

1 may 2015, 20:38:59
Vistas: 20.9K
Votos: 2

Puedo hacer que wp_logout funcione, pero no sin generar muchas advertencias ('PHP warning: Cannot modify header information - headers already sent').

wp_logout llama a wp_clear_auth_cookie, que a su vez llama a setcookie, y las cookies tienen que ir con los encabezados HTTP. Estoy llamando a wp_logout dentro de la página (en el encabezado o pie de página), de ahí el problema.

Entonces, ¿cómo se supone que debo cerrar la sesión de un usuario programáticamente? Podría hacerlo en respuesta a una petición ajax, pero eso parece exagerado. Gracias.

EDICIÓN

Código actual como sigue:

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    = 'Has cerrado sesión.';
      $loggedin = false;
   } else if(!$loggedin && isset($_GET['logout']))
      $jsmsg = "No has iniciado sesión.";

   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
Comentarios

¿Dónde/cómo estás usando wp_logout()? Publica el código por favor.

s_ha_dum s_ha_dum
1 may 2015 20:46:17

Básicamente ya respondiste tu propia pregunta: debes llamar a wp_logout antes de que cualquier contenido sea enviado al navegador.

Milo Milo
1 may 2015 23:55:23

¿Quizás delete_user_meta($user_id, 'session_tokens'); pueda ayudar? Esto también puede banear a un usuario específico. Una vez que la sesión del usuario haya sido eliminada y ese usuario (o incluso tu usuario) recargue la página, WordPress lo cerrará automáticamente.

vee vee
24 dic 2023 16:10:37
Todas las respuestas a la pregunta 2
1

Si estás usando wp_logout en tu propio código, probablemente sea mejor usar exit o wp_redirect inmediatamente después.

Puedes llamar a wp_set_current_user(0) después de wp_logout() para cerrar manualmente la sesión del usuario al instante, si necesitas continuar ejecutando PHP pero no quieres que el usuario permanezca conectado.

31 ene 2016 11:34:05
Comentarios

Desde WP 5.3 se solucionó el problema 35488 y wp_logout() incluye wp_set_current_user(0)

itinerant itinerant
10 feb 2023 18:52:17
0

Esto no es lo ideal, pero parece funcionar. No es tan simple como llamar a wp_logout antes de que se envíe cualquier contenido, porque el usuario puede o no haber cerrado sesión antes de que el resto de la página se cargue (no entiendo bien esto). En mi caso, los contenidos de la página dependen de si el usuario ha iniciado sesión o no (los menús cambian y algún código JS se ejecuta para mostrar el contenido de forma diferente).

Para este código, una solicitud de cierre de sesión redirige a la página de inicio de sesión, con un parámetro GET logout=1. Esto se comprueba en la página de inicio de sesión, que luego llama a wp_logout y redirige de nuevo a la página de inicio de sesión con un parámetro GET logout=0, para forzar una actualización.

add_action('init', 'check_logout');

function check_logout() {
   if(!isset($_GET['logout']) || ($_GET['logout'] != '1'))
      return;

   // get_permalink() y $post no están disponibles aquí, así que:
   $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 may 2015 16:58:47