更新:这个问题最初是关于如何在没有确认的情况下将用户注销,而是从“漂亮”的URL登录,而不需要立即退出。但是,回想起来,我意识到这是一个安全问题,这违背了WordPress首先需要一个nonce来注销的全部原因,所以我更新了问题和答案,以展示一种更好的实现平滑注销的方法,而链接中没有任何明显的"wp“字符串。
我想添加一个菜单项,它可以在不要求确认的情况下将用户注销。为此,我尝试创建一个重定向到实际的注销URL,并添加了一个适当的WordPress,以绕过用户确认页面,如下所示:
/**
* Adds a nonce to a bare logout link in a menu,
* presented in the form of a GET query (the "t" is for "token")
*/
add_filter('wp_nav_menu_objects', function($sorted_menu_items) {
foreach ($sorted_menu_items as $item)
if (preg_match('#^/logout/?$#', $item->url) === 1)
$item->url .= '?t='.wp_create_nonce();
return $sorted_menu_items;
});
/**
* Redirects the user to the real logout page
* & bypasses confirmation by using the previously-
* added nonce/token
*/
add_action('template_redirect', function() {
if (empty($_SERVER['REQUEST_URI'])) return;
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('#^/logout/?\?t=([0-9A-Fa-f]+)#', $uri, $matches) === 1) {
wp_redirect(home_url(
'/wp-login.php?action=logout&redirect_to=%2F&_wpnonce='.$matches[1]
), 302);
exit;
}
})
这确实成功地将用户重定向到注销页面,并添加了nonce。然而,现在的存在并没有真正阻止确认页面的出现!事实上,在确认页面本身上,the最终注销链接有它自己独立的。
发布于 2022-12-28 08:49:56
您可以使用wp_logout_url()
函数进行注销链接。它将自动将nonce添加到url。
试试下面的代码:
add_action('template_redirect', function() {
if (empty($_SERVER['REQUEST_URI'])) return;
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('#^/log-out/?$#', $uri, $matches) === 1) {
$logout_url = str_replace('&', '&', wp_logout_url());
wp_safe_redirect($logout_url);
die;
}
});
如果您不想使用wp_logout_url()
,那么尝试用“注销”字符串创建wp_create_nonce('log-out')
。
更新代码:
add_action('template_redirect', function() {
if (empty($_SERVER['REQUEST_URI'])) return;
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('#^/log-out/?$#', $uri, $matches) === 1) {
wp_redirect(home_url(
'/wp-login.php?action=logout&redirect_to=%2F&_wpnonce='.wp_create_nonce('log-out')
), 302);
exit;
}
});
https://wordpress.stackexchange.com/questions/412393
复制相似问题