WordPress登录后重定向仅管理员生效,非管理员无重定向问题排查
问题分析与修复方案
核心问题点
- 钩子绑定与参数缺失:你仅将
login_redirect钩子绑定到custom_login_redirect1函数,但该函数未声明接收钩子传递的$user参数,导致函数内部$user变量未定义,非管理员的判断逻辑全部失效,最终返回未定义的$url,WordPress会 fallback 到默认跳转规则。 - 函数未启用:逻辑相对正确的
custom_login_redirect函数没有通过add_filter绑定到钩子,完全不会被执行。 - 角色/权限混淆:
custom_login_redirect1中错误地将权限voc_edit_events当作角色来判断,$user->roles存储的是用户角色(如administrator、subscriber)而非权限,因此永远匹配不到该值,对应用户无法触发预期跳转。
修复后的代码
add_filter('login_redirect', 'custom_login_redirect', 10, 3 ); function custom_login_redirect( $redirect_to, $request, $user ) { // 用户对象不存在时返回默认跳转地址 if ( !$user || !is_object($user) ) { return $redirect_to; } // 管理员跳转至后台 if ( $user->has_cap('administrator') ) { return admin_url(); } // 拥有voc_edit_events权限的用户跳转至pieces页面 elseif ( $user->has_cap('voc_edit_events') ) { return home_url('/pieces/'); } // 其余用户跳转至protokolle页面 else { return home_url('/protokolle/'); } }
修复说明
- 正确绑定钩子与参数:将钩子绑定到有效函数,并声明接收
login_redirect钩子的三个参数,确保能获取到当前登录用户对象。 - 增加边界判断:先检查用户对象是否存在,避免未定义变量引发的错误。
- 使用官方推荐的权限判断:用
has_cap()判断权限,比直接判断角色更灵活(权限可单独赋予用户,角色也可关联多个权限)。 - 简化逻辑:每个分支直接返回对应跳转地址,避免
$url未定义的问题。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

