După autentificare, redirecționarea utilizatorului în funcție de rol către o pagină specifică

14 mai 2015, 09:54:28
Vizualizări: 35.5K
Voturi: 2

Încerc să creez un hook care, atunci când un utilizator se autentifică, verifică rolul utilizatorului.. dacă rolul utilizatorului este jsa_contributor atunci îl redirecționează către o pagină specifică. Dar se pare că codul meu nu funcționează.

Acesta este codul..

function my_login_redirect($login) {
    // Preia setările de 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)); /* Redirecționează browser-ul */
        exit();
    }
}

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

Are cineva vreo idee despre această problemă? Mulțumesc anticipat...

1
Comentarii

Puteți folosi și acest plugin. https://wordpress.org/plugins/role-based-redirect/

Yasar Yasar
25 iul. 2018 07:49:33
Toate răspunsurile la întrebare 3
3
13

OK, deci prima ta problemă este că $current_user->roles este un array și nu un string, așa că condiția ta nu va fi adevărată ;)

O altă preocupare a mea ar fi hook-ul pe care îl folosești. Unele plugin-uri îl pot folosi pentru alte scopuri, iar oprirea scriptului poate fi dăunătoare. Și... există un hook mult mai bun pentru asta ;)

Prima soluție: folosind hook-ul login_redirect

function my_login_redirect( $redirect_to, $request, $user ) {
    // există un utilizator de verificat?
    global $user;
    if ( isset( $user->roles ) && is_array( $user->roles ) ) {

        if ( in_array( 'jsa_contributor', $user->roles ) ) {
            // redirecționează-i către locația implicită
            $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 );

Dar trebuie să ții minte că acest cod va redirecționa utilizatorii doar după autentificare. Nu va restricționa accesul utilizatorilor la wp-admin.

Dacă acești utilizatori nu ar trebui să aibă acces la wp-admin, atunci ar trebui să folosești o altă metodă...

A doua soluție: restricționarea accesului la 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 mai 2015 10:09:27
Comentarii

acesta poate fi răspunsul selectat, dar reprezintă o problemă de securitate... un utilizator poate accesa în continuare alte pagini după ce s-a autentificat.

Sagive Sagive
20 iul. 2019 23:00:59

@SagiveSEO ai citit întregul răspuns? Mai ales a doua parte, unde scriu exact despre această problemă și a doua funcție (folosind admin_init) se asigură că utilizatorii neautorizați nu vor putea accesa nicio parte din backend? Pentru că nu - dacă folosești întregul răspuns, o astfel de problemă nu există.

Krzysiek Dróżdż Krzysiek Dróżdż
21 iul. 2019 14:21:20

Ohh.. ai dreptate. scuze - am ratat asta

Sagive Sagive
21 iul. 2019 14:49:16
0

Alternativ, poți folosi woocommerce_login_redirect dacă ai WooCommerce.

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

Poți adăuga redirecționare bazate pe roluri folosind un filtru astfel:

if( !function_exists('wc_custom_user_redirect') ) {
    function wc_custom_user_redirect( $redirect, $user ) {
        // Obține primul rol din toate rolurile asignate utilizatorului
        $role = $user->roles[0];
        $dashboard = admin_url();

        if( $role == 'administrator' ) {

            // Redirecționează administratorii către panoul de administrare
            $redirect = $dashboard;
        } elseif ( $role == 'shop-manager' ) {

            // Redirecționează managerii de magazin către panoul de administrare
            $redirect = $dashboard;
        } elseif ( $role == 'editor' ) {

            // Redirecționează editorii către panoul de administrare
            $redirect = $dashboard;

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

            // Redirecționează autorii către panoul de administrare
            $redirect = $dashboard;

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

            // Redirecționează clienții și abonații către pagina "Contul meu"
            $redirect = get_permalink( wc_get_page_id( 'myaccount' ) );
        } elseif ( $role == 'jsa_contributor' ) {

            // Redirecționează colaboratorii JSA către pagina "Panou colaborator 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' ) {

            // Redirecționează membrii JSA către pagina "Panou membru JSA"
            if( get_option('jsa_member_dashboard_page_id') ) { 
                $redirect = get_permalink( get_option('jsa_member_dashboard_page_id') ); 
            } else {
                $redirect = home_url();
            };
        } else {

            // Redirecționează orice alt rol către pagina vizitată anterior sau, dacă nu este disponibilă, către pagina principală
            $redirect = wp_get_referer() ? wp_get_referer() : home_url();
        }
        return $redirect;
    }
}

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

Referință: Redirecționare după autentificare în funcție de rolurile utilizatorilor în WordPress

/*@ Redirecționare după autentificare în funcție de rolurile utilizatorilor */
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 ian. 2021 18:04:29