如何根据reDirect_to的角色和内容重定向用户?

时间:2016-12-06 作者:Jordan J.

我有一个特别的问题。我的站点上只有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(我的内部员工资源页面)。

谢谢大家的帮助!

3 个回复
SO网友:pixeline

login\\u重定向挂钩似乎是正确的挂钩。

你能试试这个吗:

(改编自Codex )

function redirect_users_by_role( $redirect_to, $request, $user ) {

    if ( isset( $user->roles ) && is_array( $user->roles ) ) {

        if ( in_array( \'staff\', $user->roles ) ) {

            if ($admin_url === $request){

                return home_url(\'/resources\');

            } else{

                return $redirect_to;

            }

        }
    } else {

        return home_url(\'/access-denied\');

    }
}


add_filter( \'login_redirect\', \'redirect_users_by_role\', 10, 3 );

SO网友:David F. Carr

您可能需要使用以下测试

if(current_user_can(\'edit_posts\'))
而不是测试特定的角色名称,这样您就可以根据多个角色可能拥有或不拥有的功能来进行测试。这取决于您试图引导用户远离仪表板的原因。

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(我的内部员工资源页面)。

谢谢大家的帮助!