¿Cómo cerrar sesión sin la confirmación '¿Realmente deseas cerrar sesión?'?
Actualmente cuando cierro sesión a través de:
<a href="<?php bloginfo('url'); ?>/wp-login.php?action=logout">Cerrar sesión</a>
me redirige a una 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 del cierre de sesión?

Esto sucede porque falta el nonce necesario en la URL, el cual se verifica en wp-login.php
case 'logout' :
check_admin_referer('log-out');
...
Utiliza wp_logout_url
para obtener la URL que incluye el nonce. Si deseas redirigir a una URL personalizada, simplemente pásala como argumento.
<a href="<?php echo wp_logout_url('/url/de/redireccion/aqui') ?>">Cerrar sesión</a>
También podrías usar wp_loginout
que genera el enlace por ti incluyendo la traducción:
echo wp_loginout('/url/de/redireccion/aqui')

echo wp_loginout('/redirect/url/goes/here') está funcionando correctamente...

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 aún me redirige a la página de confirmación

Si no puedes usar la función wp_logout_url()
, puedes desactivar esta validación usando este código:
add_action('check_admin_referer', 'logout_without_confirm', 10, 2);
function logout_without_confirm($action, $result)
{
/**
* Permite cerrar sesión sin confirmación
*/
if ($action == "log-out" && !isset($_GET['_wpnonce'])) {
$redirect_to = isset($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'url-que-deseas-redireccionar';
$location = str_replace('&', '&', wp_logout_url($redirect_to));
header("Location: $location");
die;
}
}
Reemplaza 'url-que-deseas-redireccionar'
con la URL a la que deseas redirigir después de cerrar sesión.
Añádelo en tu archivo functions.php

Esto funciona para cerrar sesión sin validación, pero no redirige a la URL que quiero.

@PhuNguyen Solo necesitas agregar la URL de redirección a la solicitud de redirección en ese código donde están las comillas ' ', después de los dos puntos.

@user1264304 Creo que un JS malicioso cargado en el navegador podría hacer una redirección a la página de inicio de sesión, pero todo lo que hará es cerrar la sesión del usuario. Un 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, asumiendo que el otro sitio sabe que el usuario tiene una relación. Nuevamente, no hay consecuencia más que cerrar la sesión del usuario. Nunca he visto esto. Así que para responder a tu pregunta, no creo que haya una implicación de seguridad al eliminar la validación.

Excelente solución para mí, especialmente porque no requiere PHP adicional en mi página de cierre de sesión. Simplemente uso este enlace: wp-login.php?action=logout Y como redirección, uso home_url() para que funcione en cualquier sitio.

Definitivamente podemos usar wp_logout_url. Y esto es lo que necesitas:
$location = str_replace('&', '&', wp_logout_url($redirect_to));
Solo redirige a esa $location y cerrarás sesión sin confirmación.

Esta es una gran solución para mí, pero también encuentro que no está redirigiendo. Simplemente me devuelve a la página de inicio...

Si creas un enlace personalizado en tu menú, establece la etiqueta como “Logout”
y la URL como http://tudominio.com/wp-login.php?action=logout
. Luego, agrega esta función a tu archivo functions.php
:
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 deseas redirigir a la página de inicio de sesión después del cierre de sesión, debes agregar la URL de inicio de sesión de la siguiente manera:
$item->url = $item->url . "&_wpnonce=" . wp_create_nonce( 'log-out' ).'&redirect_to='.wp_login_url();
** probé eso y no funcionó. Realmente quiero que la página de cierre de sesión muestre "algo salió mal" al hacer clic en el botón.

Esto funcionó completamente para mí, incluyendo el redireccionamiento. Debes tener cuidado de usar el formato PHP correcto para agregar un enlace. Aquí está mi código para esa línea: $item->url = $item->url . "&_wpnonce=" . wp_create_nonce( 'log-out' ).'&redirect_to='.'https://google.com';

Si estás usando el tema inicial roots/sage para WordPress, o cualquier otro tema que utilice el motor de plantillas Blade de Laravel, asegúrate de no escapar la URL:
// no hagas esto
<a href="{{ wp_logout_url(get_permalink()) }}">cerrar sesión</a>
// haz esto en su lugar
<a href="{!! wp_logout_url(get_permalink()) !!}">cerrar sesión</a>
El primer ejemplo escapa todos los caracteres HTML, mientras que el segundo no lo hace.

Estaba obteniendo la URL de cierre de sesión usando wp_logout_url()
pero seguía mostrando la confirmación. Resultó que estaba convirtiendo caracteres como &
a &
lo cual estaba rompiendo los parámetros de la URL. Hacer esto lo solucionó:
html_entity_decode( wp_logout_url() )

Eso es mucho hacking. ¿Qué tal esto? https://wpsandbox.net/wordpress/custom-logout-link-wordpress-p1498
