我有一个特别的问题。我的站点上只有2个角色,admin和一个次要角色,用于后端的各种管理任务。
此辅助角色通常需要在登录时重定向到前端页面,除非在登录时设置了redirect\\u to URL参数。
我尝试使用login\\u重定向,但没有效果。以下是我目前拥有的:
function redirect_users_by_role() {
if ( ! defined( \'DOING_AJAX\' ) ) {
$current_user = wp_get_current_user();
$role_name = $current_user->roles[0];
$admin_url = home_url().\'/wp-admin/\';
if ( \'subscriber\' === $role_name ) {
wp_safe_redirect( home_url(\'/access-denied\') );
}
if (empty($role_name)) {
wp_safe_redirect( home_url(\'/access-denied\') );
}
if ( \'staff\' === $role_name && isset($_REQUEST[\'redirect_to\']) && !empty($_REQUEST[\'redirect_to\']) ) {
wp_safe_redirect( $_REQUEST[\'redirect_to\'] );
}
elseif ( \'staff\' === $role_name && $_REQUEST[\'redirect_to\'] == $admin_url ) {
wp_safe_redirect( home_url(\'/resources\')); exit;
}
} // DOING_AJAX
} // redirect_users_by_role
add_action( \'admin_init\', \'redirect_users_by_role\' );
如果具有staff角色的用户在登录时将帖子重定向到自身时登录并重定向到为空,则他们应该转到home\\u url()/否则,如果他们使用staff角色登录,但设置了redirect\\u to,则应该将他们重定向到该角色。我完全无法理解这一点。非常感谢您的帮助。
UPDATE
以下是我最终为使这项工作发挥作用所做的工作。由于这在我的用户流中是一个非常具体的实例,我怀疑它对任何人都有帮助,但我想确保我添加了有效的解决方案。
function admin_login_redirect( $url, $request, $user ){
//is there a user
if( $user && is_object( $user ) && is_a( $user, \'WP_User\' ) ) {
//is user admin
if( $user->has_cap( \'administrator\' ) ) {
//go do admin stuff
$url = admin_url();
//but wait there\'s more
}
}
return $url;
}
add_filter(\'login_redirect\', \'admin_login_redirect\', 10, 3 );
function staff_login_redirect( $url, $request, $user ){
if( $user && is_object( $user ) && is_a( $user, \'WP_User\' ) ) {
if( $user->has_cap(\'staff\') && strpos($_REQUEST[\'redirect_to\'], \'gf_entries\') == false ) {
//please god work
$url = home_url() . \'/resources\';
//but waittt there\'s more
} else {
//damnit all
if( $user->has_cap(\'staff\') && isset($_REQUEST[\'redirect_to\']) && strpos($_REQUEST[\'redirect_to\'], \'gf_entries\') !== false) {
$url = $_REQUEST[\'redirect_to\'];
}
}
}
return $url;
}
add_filter(\'login_redirect\', \'staff_login_redirect\', 10, 3 );
function transient_login_redirect( $url, $request, $user ) {
if ( $user && is_object( $user ) && is_a( $user, \'WP_User\' ) ) {
if (!$user->has_cap(\'administrator\') && !$user->has_cap(\'staff\') ) {
//go away
$url= home_url(\'/access-denied\');
}
}
return $url;
}
add_filter(\'login_redirect\', \'transient_login_redirect\', 10, 3);
最终的解决方案是在将逻辑拆分为不同的函数并钩住login\\u重定向钩子的基础上检查几件事。
对于管理员,我只是将他们发送到任何地方。
对于员工,我会使用strpos()检查他们是否要去后端的某个地方,在任何给定的一天,重力表单页面“gf\\u entries”。如果他们没有通过$\\u REQUEST[\'redirect\\u to\']参数转到wp admin的那个区域,那么我们会将他们发送到/resources(我的内部员工资源页面)。
谢谢大家的帮助!
SO网友:Jordan J.
以下是我最终为使这项工作发挥作用所做的工作。由于这在我的用户流中是一个非常具体的实例,我怀疑它对任何人都有帮助,但我想确保我添加了有效的解决方案。
function admin_login_redirect( $url, $request, $user ){
//is there a user
if( $user && is_object( $user ) && is_a( $user, \'WP_User\' ) ) {
//is user admin
if( $user->has_cap( \'administrator\' ) ) {
//go do admin stuff
$url = admin_url();
//but wait there\'s more
}
}
return $url;
}
add_filter(\'login_redirect\', \'admin_login_redirect\', 10, 3 );
function staff_login_redirect( $url, $request, $user ){
if( $user && is_object( $user ) && is_a( $user, \'WP_User\' ) ) {
if( $user->has_cap(\'staff\') && strpos($_REQUEST[\'redirect_to\'], \'gf_entries\') == false ) {
//please god work
$url = home_url() . \'/resources\';
//but waittt there\'s more
} else {
//damnit all
if( $user->has_cap(\'staff\') && isset($_REQUEST[\'redirect_to\']) && strpos($_REQUEST[\'redirect_to\'], \'gf_entries\') !== false) {
$url = $_REQUEST[\'redirect_to\'];
}
}
}
return $url;
}
add_filter(\'login_redirect\', \'staff_login_redirect\', 10, 3 );
function transient_login_redirect( $url, $request, $user ) {
if ( $user && is_object( $user ) && is_a( $user, \'WP_User\' ) ) {
if (!$user->has_cap(\'administrator\') && !$user->has_cap(\'staff\') ) {
//go away
$url= home_url(\'/access-denied\');
}
}
return $url;
}
add_filter(\'login_redirect\', \'transient_login_redirect\', 10, 3);
最终的解决方案是在将逻辑拆分为不同的函数并钩住login\\u重定向钩子的基础上检查几件事。
对于管理员,我只是将他们发送到任何地方。
对于员工,我会使用strpos()检查他们是否要去后端的某个地方,在任何给定的一天,重力表单页面“gf\\u entries”。如果他们没有通过$\\u REQUEST[\'redirect\\u to\']参数转到wp admin的那个区域,那么我们会将他们发送到/resources(我的内部员工资源页面)。
谢谢大家的帮助!