Después del inicio de sesión redirigir el rol de usuario a una página
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...

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' );

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.

@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.

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 );

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;
