Come ottenere il Nome del Ruolo dell'utente corrente? (WordPress)

19 set 2016, 14:58:05
Visualizzazioni: 22K
Voti: 2

Al momento ho questo snippet:

$user = new WP_User(get_current_user_id()); 
echo $user->roles[1];

e l'output è lo slug del ruolo del forum bbPress. (roles[0] sarebbe il ruolo generale di WP ma non mi serve.)

Quello di cui ho bisogno è il nome del ruolo, non lo slug. Quindi, l'output previsto dovrebbe essere qualcosa come "Keymaster", "Participant", "Spectator" ecc.

Quindi, come posso ottenere il Nome del Ruolo dell'utente corrente?

1
Commenti

La funzione wp_get_current_user() dovrebbe aiutarti. Riceverai tutti i dati dell'utente tramite la classe `WP_User`.

bueltge bueltge
19 set 2016 15:31:51
Tutte le risposte alla domanda 5
2

Non sono sicuro se bbPress segua le convenzioni di WordPress, ma WP ha una classe globale chiamata $WP-roles che contiene le informazioni sui ruoli. Quindi, partendo da quello che hai, c'è il ruolo dell'utente corrente:

$current_role = $user->roles[1];

Successivamente, recupera un elenco di tutti i ruoli:

$all_roles = $wp_roles->roles; 

Poi, scorri $all_roles e trova il $current_role":

foreach ($all_roles as $role_key => $role_details) {
  if ($role_key == $current_role) $current_role_name = $role_details['name'];
  }

Ora, $current_role_name dovrebbe contenere il nome visualizzato che stai cercando (non ho verificato questo codice, però).

19 set 2016 15:30:42
Commenti

Il risultato è un avviso che dice: Invalid argument supplied for foreach()

booster booster
21 set 2016 01:01:23

Non uso bbPress, quindi non so se modifica la struttura dei ruoli. Se usi var_dump su $all_roles dovresti poter vedere la sua struttura e adattare il ciclo foreach con gli argomenti corretti.

cjbj cjbj
21 set 2016 10:17:11
0

grazie per questo snippet di codice! Sto gestendo un'installazione di Buddypress (e un tema personalizzato) dove è possibile aggiungere più ruoli a un utente. Ho modificato leggermente il tuo codice per farlo funzionare:

<?php
//Ottieni il nome del ruolo tramite ID utente
if( !function_exists('get_user_role_name') ){
    function get_user_role_name($user_ID){
    global $wp_roles;

        $user_data = get_userdata($user_ID);
        $user_role_slug = $user_data->roles;

        foreach($user_role_slug as $user_role){
            //conta il numero di ruoli utente
            $user_role_nr++;
            //aggiungi una virgola come separatore se c'è più di un ruolo
            if($user_role_nr > 1) { $user_role_list .= ", "; }
            //aggiungi il nome del ruolo
            $user_role_list .= translate_user_role($wp_roles->roles[$user_role]['name']);
        }

    //restituisci la lista dei ruoli utente
    return $user_role_list;

    }
}
?>
10 giu 2020 13:05:25
0

Forse hanno già risolto questo problema. Ma, ora ho appena scritto questo e ho deciso di condividerlo.

<?php
//Ottieni il nome del ruolo tramite ID utente
if( !function_exists('get_user_role_name') ){
    function get_user_role_name($user_ID){
        global $wp_roles;

        $user_data = get_userdata($user_ID);
        $user_role_slug = $user_data->roles[0];
        return translate_user_role($wp_roles->roles[$user_role_slug]['name']);
    }
}
?>

<?php echo get_user_role_name(ID utente qui);?>
12 gen 2020 01:40:06
4

Puoi ottenere il nome del ruolo dell'utente corrente (nome tradotto ma non lo slug) utilizzando la seguente funzione, devi solo passare lo slug del ruolo dell'utente corrente come parametro:

function wp_get_current_user_translatable_role_name( $current_user_role_slug = '' ) {
    $role_name = '';

    if ( ! function_exists( 'get_editable_roles' ) ) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
    }

    // Nota che translate_user_role attualmente non funziona nel front-end.
    load_textdomain( 'default', WP_LANG_DIR . '/admin-' . get_locale() . '.mo' );

    $editable_roles = array_reverse( get_editable_roles() );

    foreach ( $editable_roles as $role => $details ) {
        $name = translate_user_role( $details['name'] );
        // preseleziona il ruolo specificato
        if ( $current_user_role_slug == $role ) {
            $role_name  = $name;
        }
    }

    echo $role_name ;
}

Ora, ottieni lo slug del ruolo dell'utente corrente con il seguente codice:

$user_meta = get_userdata(get_current_user_id());
$current_user_role_slug = $user_meta->roles[0];

Utilizza la funzione wp_get_current_user_translatable_role_name( $current_user_role_slug ); per ottenere il nome del ruolo dell'utente corrente (nome tradotto ma non lo slug).

NOTA: L'utente deve essere loggato per visualizzare il nome del ruolo.

25 apr 2019 09:13:44
Commenti

Citazione: "Quello che mi serve è il nome del ruolo, non lo slug."

nmr nmr
25 apr 2019 10:07:51

@nmr puoi semplicemente visualizzare il nome della variabile così: <?php echo ucfirst($role_name); ?> questo dovrebbe mostrare ad esempio "Keymaster", "Participant", "Spectator", "administrator" ecc.

Razon Komar Pal Razon Komar Pal
28 apr 2019 07:56:44

Ma rimane comunque uno slug. Cosa succede se il ruolo sarà tipo slug='spectator_vip' name= 'VIP Spectator' oppure slug= 'shop_manager' name= 'Shop Manager'. Se un utente ha un ruolo "editor" (slug del ruolo predefinito), nella lista utenti, a seconda della lingua attiva, potresti vedere "Editor", "Redattore", "редактор". Non puoi dare per scontato che il nome sia uguale allo slug.

nmr nmr
28 apr 2019 08:33:15

@nmr guarda il mio codice modificato, avevo frainteso il punto della domanda ma ora ho capito il punto e l'ho sistemato.

Razon Komar Pal Razon Komar Pal
28 apr 2019 10:48:57
1

Ecco il modo per ottenerlo

function get_user_role($user_id) {
    global $wp_roles;

    $roles = array();
    $user = new WP_User( $user_id );
    if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
    foreach ( $user->roles as $role )
        $roles[] .= translate_user_role( $role );
    }
    return implode(', ',$roles);
} 
//poi chiama la funzione con il parametro userid
echo get_user_role( 7 );
25 apr 2019 10:40:18
Commenti

Il codice nella sua forma attuale tenta di tradurre lo slug, che è una soluzione poco efficace. Dovresti passare il nome del ruolo alla funzione translate_user_role().

nmr nmr
25 apr 2019 11:33:08