使用login_url钩子按角色重定向WordPress用户遇登录用户异常
问题原因及解决方案
核心问题
你存在两个关键错误:
- 钩子场景误用:
login_url钩子的作用是修改「生成的登录链接地址」,而非处理用户访问登录页时的跳转逻辑。你直接返回/access-denied/,相当于把所有登录链接都替换成了这个地址,已登录用户触发登录跳转(比如系统默认从登录页跳后台)时就会被带到该页面。 - 变量作用域错误:你在函数外部定义
$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
相关产品推荐
相关产品推荐

