You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用login_url钩子按角色重定向WordPress用户遇登录用户异常

问题原因及解决方案

核心问题

你存在两个关键错误:

  1. 钩子场景误用:login_url钩子的作用是修改「生成的登录链接地址」,而非处理用户访问登录页时的跳转逻辑。你直接返回/access-denied/,相当于把所有登录链接都替换成了这个地址,已登录用户触发登录跳转(比如系统默认从登录页跳后台)时就会被带到该页面。
  2. 变量作用域错误:你在函数外部定义$current_user,当login_url钩子触发时,WordPress可能还未完成当前用户数据的加载,导致已登录用户的角色信息无法正确读取,误判为无有效角色。

正确实现方案

如果你的需求是:未登录用户正常访问自定义登录页,已登录用户根据角色判断权限,无权限则跳转到/access-denied/,有权限则跳转到后台或指定页面,请使用template_redirect钩子实现,代码如下:

function my_role_based_redirect() {
    // 仅在自定义登录页或默认登录页触发逻辑
    if ( ! is_login() && ! is_page('login') ) {
        return;
    }

    $current_user = wp_get_current_user();
    
    // 未登录用户,允许访问登录页
    if ( ! is_user_logged_in() ) {
        return;
    }

    // 已登录用户,检查角色权限
    $valid_roles = [ "administrator", "editor", "custom-role" ];
    $has_valid_role = array_intersect( $valid_roles, $current_user->roles );

    if ( empty( $has_valid_role ) ) {
        wp_redirect( home_url('/access-denied/') );
        exit;
    } else {
        // 有权限的已登录用户,跳转到后台或自定义页面
        wp_redirect( admin_url() );
        exit;
    }
}
add_action( 'template_redirect', 'my_role_based_redirect' );

额外说明

如果只是想把默认登录链接修改为/login/,单独用login_url钩子即可,不要混入角色判断逻辑:

function custom_login_url( $login_url ) {
    return home_url('/login/');
}
add_filter( 'login_url', 'custom_login_url', 10 );

内容的提问来源于stack exchange,提问作者MoSamir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:19:54