¿Cómo cerrar la sesión de un usuario con wp_logout?
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()

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.

Desde WP 5.3 se solucionó el problema 35488 y wp_logout() incluye wp_set_current_user(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()
