如何配置login_redirect过滤器,不覆盖redirect_to参数实现角色跳转?
修复WordPress登录跳转逻辑问题
原代码存在的问题
- 角色判断逻辑缺陷:直接取
$user->roles[0]仅获取用户第一个角色,忽略用户可能拥有多个角色的场景,导致角色判断不准确。 - 自定义跳转参数处理不规范:直接使用
$_GET["redirect_to"]存在安全风险,且未利用钩子提供的$request参数,同时未优先处理自定义跳转逻辑。 - 逻辑顺序颠倒:需求明确自定义跳转参数优先级最高,但原代码先判断角色再检查参数,不符合需求逻辑。
- 代码分支覆盖不全:部分场景(如目标角色但存在自定义跳转、非目标角色无自定义跳转)无明确返回值,导致跳转异常。
修复后的代码
function my_login_redirect($redirect_to, $request, $user) { // 优先处理自定义跳转:存在有效redirect_to参数则直接返回该地址 if (!empty($request['redirect_to'])) { return $request['redirect_to']; } // 验证用户对象有效性及角色数据 if (isset($user) && is_a($user, 'WP_User') && !empty($user->roles)) { // 检查用户是否包含指定角色 if (in_array('partner', $user->roles) || in_array('team_member', $user->roles)) { // 跳转到目标页面 return site_url('welcome-user/'); } } // 其他场景返回默认跳转地址 return $redirect_to; } add_filter('login_redirect', 'my_login_redirect', 10, 3);
修复说明
- 调整逻辑顺序,确保自定义跳转参数优先生效,符合需求优先级。
- 使用
in_array()检查角色,支持用户拥有多个角色的场景,判断更准确。 - 通过
is_a($user, 'WP_User')验证用户对象有效性,避免潜在报错。 - 利用钩子提供的
$request变量获取跳转参数,符合WordPress开发规范。 - 完善所有分支的返回值,确保任何场景下都有明确的跳转目标。
内容的提问来源于stack exchange,提问作者user315338
相关产品推荐
相关产品推荐

