Después del inicio de sesión redirigir el rol de usuario a una página

14 may 2015, 09:54:28
Vistas: 35.5K
Votos: 2

Estoy tratando de crear un hook que cuando un usuario inicie sesión, verifique el rol del usuario... si el rol del usuario es jsa_contributor entonces redirige a una página específica. Pero parece que mi código no funciona.

Este es el código...

function my_login_redirect($login) {
    $data_login = get_option('axl_jsa_login_wid_setup');
    $redirect_page = $data_login[0];

    $logout_redirect_page = $data_login[1];

    $current_user = get_user_by('login',$login);
    if($current_user->roles == 'jsa_contributor'){
        wp_redirect(get_permalink($redirect_page)); /* Redirige el navegador */
        exit();
    }
}

add_action('wp_login', 'my_login_redirect', 99);

¿Alguien tiene alguna idea sobre esto? Gracias de antemano...

1
Comentarios

También puedes usar este plugin. https://wordpress.org/plugins/role-based-redirect/

Yasar Yasar
25 jul 2018 07:49:33
Todas las respuestas a la pregunta 3
3
13

OK, entonces tu primer problema es que $current_user->roles es un array y no un string, por lo que tu condición no será verdadera ;)

Otra preocupación mía sería el hook que estás usando. Algunos plugins pueden usarlo para otros propósitos, y terminar el script puede ser perjudicial. Y... hay un hook mucho mejor para esto ;)

Primera solución: usando el hook login_redirect

function my_login_redirect( $redirect_to, $request, $user ) {
    // ¿hay un usuario para verificar?
    global $user;
    if ( isset( $user->roles ) && is_array( $user->roles ) ) {

        if ( in_array( 'jsa_contributor', $user->roles ) ) {
            // redirigirlos al lugar por defecto
            $data_login = get_option('axl_jsa_login_wid_setup');

            return get_permalink($data_login[0]);
        } else {
            return home_url();
        }
    } else {
        return $redirect_to;
    }
}
add_filter( 'login_redirect', 'my_login_redirect', 10, 3 );

Pero debes recordar que este código redirigirá a los usuarios solo después de iniciar sesión. No restringirá el acceso de los usuarios a wp-admin.

Si estos usuarios no deberían poder acceder a wp-admin, entonces deberías usar otro método...

Segunda solución: restringir el acceso a wp-admin

function my_restrict_wpadmin_access() {
    if ( ! defined('DOING_AJAX') || ! DOING_AJAX ) {
        $user = wp_get_current_user();

        if ( isset( $user->roles ) && is_array( $user->roles ) ) {
            if ( in_array('jsa_contributor', $user->roles) ) {
                $data_login = get_option('axl_jsa_login_wid_setup');
                wp_redirect( get_permalink($data_login[0]) );
                die;
            }
        }
    }
}
add_action( 'admin_init', 'my_restrict_wpadmin_access' );
14 may 2015 10:09:27
Comentarios

esta puede ser la respuesta seleccionada, pero es un problema de seguridad... un usuario aún puede acceder a otras páginas después de iniciar sesión.

Sagive Sagive
20 jul 2019 23:00:59

@SagiveSEO ¿has leído toda la respuesta? Especialmente la segunda parte, donde escribo exactamente sobre ese problema y la segunda función (usando admin_init) se asegura de que los usuarios no autorizados no puedan acceder a ninguna parte del backend. Porque no - si usas toda la respuesta, ese problema no existe.

Krzysiek Dróżdż Krzysiek Dróżdż
21 jul 2019 14:21:20

Ohh.. tienes razón. disculpas - no lo había visto

Sagive Sagive
21 jul 2019 14:49:16
0

Alternativamente puedes usar el filtro woocommerce_login_redirect si tienes WooCommerce instalado.

apply_filters( 'woocommerce_login_redirect',  $redirect,  $user );

Puedes añadir redirecciones basadas en roles usando un filtro como este:

if( !function_exists('wc_custom_user_redirect') ) {
    function wc_custom_user_redirect( $redirect, $user ) {
        // Obtiene el primer rol asignado al usuario
        $role = $user->roles[0];
        $dashboard = admin_url();

        if( $role == 'administrator' ) {

            // Redirige administradores al escritorio
            $redirect = $dashboard;
        } elseif ( $role == 'shop-manager' ) {

            // Redirige gestores de tienda al escritorio
            $redirect = $dashboard;
        } elseif ( $role == 'editor' ) {

            // Redirige editores al escritorio
            $redirect = $dashboard;

        } elseif ( $role == 'author' ) {

            // Redirige autores al escritorio
            $redirect = $dashboard;

        } elseif ( $role == 'customer' || $role == 'subscriber' ) {

            // Redirige clientes y suscriptores a la página "Mi cuenta"
            $redirect = get_permalink( wc_get_page_id( 'myaccount' ) );
        } elseif ( $role == 'jsa_contributor' ) {

            // Redirige colaboradores JSA a la página "Panel de Colaborador JSA"
            if( get_option('jsa_contributor_dashboard_page_id') ) { 
                $redirect  = get_permalink( get_option('jsa_contributor_dashboard_page_id') ); 
            } else {
                $redirect = home_url();
            }; 
        } elseif ( $role == 'JSA Member' ) {

            // Redirige miembros JSA a la página "Panel de Miembro JSA"
            if( get_option('jsa_member_dashboard_page_id') ) { 
                $redirect = get_permalink( get_option('jsa_member_dashboard_page_id') ); 
            } else {
                $redirect = home_url();
            };
        } else {

            // Redirige cualquier otro rol a la página visitada anteriormente o, si no está disponible, a la página de inicio
            $redirect = wp_get_referer() ? wp_get_referer() : home_url();
        }
        return $redirect;
    }
}

add_filter( 'woocommerce_login_redirect', 'wc_custom_user_redirect', 10, 2 );
25 jul 2018 13:18:40
0

Referencia: Redirección después del inicio de sesión por roles de usuario en WordPress

/*@ Redirección después del login por rol de usuario */
if ( !function_exists('tf_after_login_redirection_by_user_roles') ):

    add_filter( 'login_redirect', 'tf_after_login_redirection_by_user_roles', 10, 3 );  
    function tf_after_login_redirection_by_user_roles( $redirect_to, $request, $user ) {
        
        global $user;

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

            if ( in_array( 'student', $user->roles ) ) :

                $page_id = 77;
                
                return get_permalink($page_id);

            elseif ( in_array( 'teacher', $user->roles ) ) :

                $page_id = 78;
                
                return get_permalink($page_id);

            elseif ( in_array( 'super-user', $user->roles ) ) :

                $page_id = 79;
                
                return get_permalink($page_id);

            else:
                return home_url();
            endif;
            
        else:
            return $redirect_to;
        endif;
    }
endif;
2 ene 2021 18:04:29