Cómo cerrar sesión sin confirmación "¿Realmente desea cerrar sesión?"?

13

En este momento cuando me desconecto a través de:

<a href="<?php bloginfo('url'); ?>/wp-login.php?action=logout">Log out</a>

me redirige a la página donde necesito confirmar el cierre de sesión.

¿Cómo eliminar la confirmación y redirigir a la página de inicio después de cerrar sesión?

Derfder
fuente

Respuestas:

30

Esto sucede porque falta el nonce necesario en la URL, que se está registrando en wp-login.php

case 'logout' :
    check_admin_referer('log-out');
    ...

Úselo wp_logout_urlpara recuperar la URL, incluido el nonce. Si desea redirigir a una URL personalizada, simplemente páselo como argumento.

<a href="<?php echo wp_logout_url('/redirect/url/goes/here') ?>">Log out</a>

También puede usar el wp_loginoutque genera el enlace para usted, incluida la traducción:

echo wp_loginout('/redirect/url/goes/here')
ndm
fuente
1
echo wp_loginout ('/ redirect / url / goes / here') funciona bien ..
Mayur Devmurari
1
Estoy usando wp_logout_url( get_permalink())y la página de confirmación no se omite. El nonce se genera como parte de la URL pero todavía me envían a la página de confirmación
Ralphonz
Mismo problema aquí :(
Jarmerson
15

Si no puede usar la wp_logout_url()función, puede desactivar esta validación usando este código:

add_action('check_admin_referer', 'logout_without_confirm', 10, 2);
function logout_without_confirm($action, $result)
{
    /**
     * Allow logout without confirmation
     */
    if ($action == "log-out" && !isset($_GET['_wpnonce'])) {
        $redirect_to = isset($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'url-you-want-to-redirect';
        $location = str_replace('&amp;', '&', wp_logout_url($redirect_to));
        header("Location: $location");
        die;
    }
}

Reemplace 'url-you-want-to-redirect'con la URL que desea redirigir después de cerrar sesión.

Añádelo a tu functions.php

Дмитрий Шишов
fuente
Esto funciona para cerrar sesión sin validación, pero no redirige a la URL que quiero.
Phu Nguyen
@PhuNguyen Solo necesita agregar la URL de redireccionamiento a la solicitud de redireccionamiento en ese código donde hay '' comillas, después de los dos puntos.
NJENGAH
¿Hay alguna implicación de seguridad para eliminar esta validación?
rok
@ user1264304 Creo que JS malicioso cargado de alguna manera en el navegador podría redirigir a la página de inicio de sesión, pero todo lo que hará es cerrar la sesión del usuario. El código verdaderamente malicioso probablemente buscaría reemplazar la URL antes de un nonce válido. El usuario podría navegar a otro sitio que luego tenga un enlace a la página de cierre de sesión del sitio actual, suponiendo que el otro sitio sepa que el usuario tiene una relación. Nuevamente, no hay otra consecuencia que cerrar la sesión del usuario. Nunca he visto esto. Entonces, para responder a su pregunta, no creo que haya una implicación de seguridad para eliminar la validación.
TonyG
Err, demasiados redireccionamientos ...
Solomon Closson
3

Si crea un enlace personalizado en su menú, establezca la etiqueta “Logout”y establezca la URL en http://yourdomain.com/wp-login.php?action=logout. Luego agregue esta función a su functions.phparchivo:

function change_menu($items){
  foreach($items as $item){
    if( $item->title == "Logout"){
         $item->url = $item->url . "&_wpnonce=" . wp_create_nonce( 'log-out' );
    }
  }
  return $items;

}
add_filter('wp_nav_menu_objects', 'change_menu');

Si desea redirigir a la página de inicio de sesión después de cerrar sesión, debe agregar la URL de inicio de sesión como:

$item->url = $item->url . "&_wpnonce=" . wp_create_nonce( 'log-out' ).'&redirect_to='.wp_login_url();

Link de referencia

Gufran Hasan
fuente
-2

Esto funcionó para mí agregando /?customer-logout=trueal final.

http://www.website.com/?customer-logout=true

Stanley Tan
fuente