首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >链接中没有"wp“的菜单中的注销按钮

链接中没有"wp“的菜单中的注销按钮
EN

WordPress Development用户
提问于 2022-12-28 03:01:53
回答 1查看 186关注 0票数 1

更新:这个问题最初是关于如何在没有确认的情况下将用户注销,而是从“漂亮”的URL登录,而不需要立即退出。但是,回想起来,我意识到这是一个安全问题,这违背了WordPress首先需要一个nonce来注销的全部原因,所以我更新了问题和答案,以展示一种更好的实现平滑注销的方法,而链接中没有任何明显的"wp“字符串。

我想添加一个菜单项,它可以在不要求确认的情况下将用户注销。为此,我尝试创建一个重定向到实际的注销URL,并添加了一个适当的WordPress,以绕过用户确认页面,如下所示:

代码语言:javascript
运行
复制
/**
 * 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最终注销链接有它自己独立的

EN

回答 1

WordPress Development用户

回答已采纳

发布于 2022-12-28 08:49:56

您可以使用wp_logout_url()函数进行注销链接。它将自动将nonce添加到url。

试试下面的代码:

代码语言:javascript
运行
复制
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')

更新代码:

代码语言:javascript
运行
复制
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;
    }
});
票数 0
EN
页面原文内容由WordPress Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://wordpress.stackexchange.com/questions/412393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档