Dopo il login reindirizzare l'utente in base al ruolo su una pagina specifica

14 mag 2015, 09:54:28
Visualizzazioni: 35.5K
Voti: 2

Sto cercando di creare un hook che quando un utente effettua il login, controlli il ruolo dell'utente... se il ruolo è jsa_contributor allora reindirizzi su una pagina specifica. Ma sembra che il mio codice non funzioni.

Questo è il codice...

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)); /* Reindirizza il browser */
        exit();
    }
}

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

Qualcuno ha un'idea su questo? Grazie in anticipo...

1
Commenti

Puoi anche utilizzare questo plugin. https://wordpress.org/plugins/role-based-redirect/

Yasar Yasar
25 lug 2018 07:49:33
Tutte le risposte alla domanda 3
3
13

OK, quindi il tuo primo problema è che $current_user->roles è un array e non una stringa, quindi la tua condizione non sarà vera ;)

Un'altra mia preoccupazione sarebbe l'hook che stai usando. Alcuni plugin potrebbero usarlo per altri scopi, e terminare lo script potrebbe essere dannoso. E... c'è un hook molto migliore per questo ;)

Prima soluzione: usando l'hook login_redirect

function my_login_redirect( $redirect_to, $request, $user ) {
    //c'è un utente da controllare?
    global $user;
    if ( isset( $user->roles ) && is_array( $user->roles ) ) {

        if ( in_array( 'jsa_contributor', $user->roles ) ) {
            // reindirizzali alla posizione predefinita
            $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 );

Ma devi ricordare che questo codice reindirizzerà gli utenti solo dopo il login. Non impedirà agli utenti di accedere a wp-admin.

Se questi utenti non dovrebbero poter accedere a wp-admin, allora dovresti usare un altro metodo...

Seconda soluzione: restringere l'accesso 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 mag 2015 10:09:27
Commenti

questa potrebbe essere la risposta selezionata, ma è un problema di sicurezza... un utente può ancora accedere ad altre pagine dopo essersi loggato.

Sagive Sagive
20 lug 2019 23:00:59

@SagiveSEO hai letto tutta la risposta? In particolare la seconda parte, dove scrivo esattamente di quel problema e la seconda funzione (usando admin_init) assicura che gli utenti non autorizzati non possano accedere a nessuna parte del backend? Perché no - se usi tutta la risposta, questo problema non esiste.

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

Ohh.. hai ragione. scusa - mi era sfuggito

Sagive Sagive
21 lug 2019 14:49:16
0

In alternativa, puoi utilizzare il filtro woocommerce_login_redirect se hai WooCommerce.

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

Puoi aggiungere un reindirizzamento basato sui ruoli utilizzando un filtro come questo:

if( !function_exists('wc_custom_user_redirect') ) {
    function wc_custom_user_redirect( $redirect, $user ) {
        // Ottieni il primo ruolo assegnato all'utente
        $role = $user->roles[0];
        $dashboard = admin_url();

        if( $role == 'administrator' ) {

            // Reindirizza gli amministratori alla dashboard
            $redirect = $dashboard;
        } elseif ( $role == 'shop-manager' ) {

            // Reindirizza i gestori del negozio alla dashboard
            $redirect = $dashboard;
        } elseif ( $role == 'editor' ) {

            // Reindirizza gli editori alla dashboard
            $redirect = $dashboard;

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

            // Reindirizza gli autori alla dashboard
            $redirect = $dashboard;

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

            // Reindirizza i clienti e gli abbonati alla pagina "Il mio account"
            $redirect = get_permalink( wc_get_page_id( 'myaccount' ) );
        } elseif ( $role == 'jsa_contributor' ) {

            // Reindirizza i collaboratori JSA alla pagina "Dashboard Collaboratore 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' ) {

            // Reindirizza i membri JSA alla pagina "Dashboard Membro JSA"
            if( get_option('jsa_member_dashboard_page_id') ) { 
                $redirect = get_permalink( get_option('jsa_member_dashboard_page_id') ); 
            } else {
                $redirect = home_url();
            };
        } else {

            // Reindirizza qualsiasi altro ruolo alla pagina visitata precedentemente o, se non disponibile, alla home
            $redirect = wp_get_referer() ? wp_get_referer() : home_url();
        }
        return $redirect;
    }
}

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

Riferimento: Reindirizzamento dopo il login in base ai ruoli utente in WordPress

/*@ Reindirizzamento dopo il login in base ai ruoli utente */
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 gen 2021 18:04:29