После входа в систему перенаправить пользователя с определенной ролью на страницу
Я пытаюсь создать хук, который при входе пользователя проверяет его роль.. если роль пользователя jsa_contributor
, то происходит перенаправление на определенную страницу. Но похоже, мой код не работает.
Вот код..
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)); /* Перенаправление браузера */
exit();
}
}
add_action('wp_login', 'my_login_redirect', 99);
есть ли у кого-нибудь идеи по этому поводу? заранее спасибо...

Итак, ваша первая проблема в том, что $current_user->roles
является массивом, а не строкой, поэтому ваше условие не сработает ;)
Ещё меня беспокоит хук, который вы используете. Некоторые плагины могут использовать его для других целей, и прерывание скрипта может быть вредным. И... для этого есть гораздо лучший хук ;)
Первое решение: использование хука login_redirect
function my_login_redirect( $redirect_to, $request, $user ) {
// есть ли пользователь для проверки?
global $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');
return get_permalink($data_login[0]);
} else {
return home_url();
}
} else {
return $redirect_to;
}
}
add_filter( 'login_redirect', 'my_login_redirect', 10, 3 );
Но помните, что этот код будет перенаправлять пользователей только после входа в систему. Он не ограничивает доступ пользователей к wp-admin.
Если эти пользователи не должны иметь доступ к wp-admin, тогда вам следует использовать другой метод...
Второе решение: ограничение доступа к 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' );

это, возможно, выбранный ответ, но здесь есть проблема с безопасностью... пользователь все еще может получать доступ к другим страницам после входа в систему.

@SagiveSEO ты прочитал весь ответ? Особенно вторую часть, где я как раз пишу об этой проблеме и вторая функция (с использованием admin_init) гарантирует, что неавторизованные пользователи не смогут получить доступ к каким-либо разделам админки? Потому что нет - если использовать весь ответ, такой проблемы не существует.

Вы также можете использовать woocommerce_login_redirect
, если у вас установлен WooCommerce.
apply_filters( 'woocommerce_login_redirect', $redirect, $user );
Вы можете добавить перенаправление в зависимости от ролей, используя фильтр следующим образом:
if( !function_exists('wc_custom_user_redirect') ) {
function wc_custom_user_redirect( $redirect, $user ) {
// Получаем первую роль из всех ролей, назначенных пользователю
$role = $user->roles[0];
$dashboard = admin_url();
if( $role == 'administrator' ) {
// Перенаправляем администраторов в админку
$redirect = $dashboard;
} elseif ( $role == 'shop-manager' ) {
// Перенаправляем менеджеров магазина в админку
$redirect = $dashboard;
} elseif ( $role == 'editor' ) {
// Перенаправляем редакторов в админку
$redirect = $dashboard;
} elseif ( $role == 'author' ) {
// Перенаправляем авторов в админку
$redirect = $dashboard;
} elseif ( $role == 'customer' || $role == 'subscriber' ) {
// Перенаправляем покупателей и подписчиков на страницу "Мой аккаунт"
$redirect = get_permalink( wc_get_page_id( 'myaccount' ) );
} elseif ( $role == 'jsa_contributor' ) {
// Перенаправляем JSA Contributor на страницу "Панель управления JSA Contributor"
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' ) {
// Перенаправляем JSA Member на страницу "Панель управления JSA Member"
if( get_option('jsa_member_dashboard_page_id') ) {
$redirect = get_permalink( get_option('jsa_member_dashboard_page_id') );
} else {
$redirect = home_url();
};
} else {
// Перенаправляем любые другие роли на предыдущую посещённую страницу или на главную, если предыдущая страница недоступна
$redirect = wp_get_referer() ? wp_get_referer() : home_url();
}
return $redirect;
}
}
add_filter( 'woocommerce_login_redirect', 'wc_custom_user_redirect', 10, 2 );

Ссылка: Перенаправление после входа в систему по ролям пользователей в WordPress
/*@ Перенаправление после входа по ролям пользователей */
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;
