После входа в систему перенаправить пользователя с определенной ролью на страницу

14 мая 2015 г., 09:54:28
Просмотры: 35.5K
Голосов: 2

Я пытаюсь создать хук, который при входе пользователя проверяет его роль.. если роль пользователя 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);

есть ли у кого-нибудь идеи по этому поводу? заранее спасибо...

1
Комментарии

Вы также можете использовать этот плагин. https://wordpress.org/plugins/role-based-redirect/

Yasar Yasar
25 июл. 2018 г. 07:49:33
Все ответы на вопрос 3
3
13

Итак, ваша первая проблема в том, что $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' );
14 мая 2015 г. 10:09:27
Комментарии

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

Sagive Sagive
20 июл. 2019 г. 23:00:59

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

Krzysiek Dróżdż Krzysiek Dróżdż
21 июл. 2019 г. 14:21:20

Ох.. Ты прав. Извини - пропустил это

Sagive Sagive
21 июл. 2019 г. 14:49:16
0

Вы также можете использовать 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 );
25 июл. 2018 г. 13:18:40
0

Ссылка: Перенаправление после входа в систему по ролям пользователей в 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;
2 янв. 2021 г. 18:04:29