Se l'utente corrente è un amministratore o un editor


103

Come posso verificare se l'utente attualmente connesso è un amministratore o un editor?

So come fare ciascuno singolarmente:

<?php if(current_user_can('editor')) { ?> 
    <!-- Stuff here for editors -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Stuff here for administrators -->
<?php } ?>

Ma come faccio a lavorare insieme? Cioè, l'utente è un amministratore o un editore?


10
if( current_user_can('editor') || current_user_can('administrator') )
Shazzad,

Risposte:


192

Prima risposta, non relativa a WordPress perché è solo PHP: utilizzare l'operatore "OR" logico:

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Stuff here for administrators or editors
<?php } ?>

Se si desidera controllare più di due ruoli, è possibile verificare se i ruoli dell'utente corrente si trovano all'interno di una matrice di ruoli, ad esempio:

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Stuff here for allowed roles
<?php } ?>

Tuttavia, current_user_canpuò essere utilizzato non solo con il nome del ruolo degli utenti, ma anche con le funzionalità.

Quindi, una volta che sia gli editor che gli amministratori possono modificare le pagine, la tua vita può essere più semplice verificando queste funzionalità:

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Stuff here for user roles that can edit pages: editors and administrators
<?php } ?>

Dai un'occhiata qui per maggiori informazioni sulle funzionalità.


1
devi verificare se is_logged_in();?
RobBenz,

3
@RobBenz no, in nessuno dei casi. Perché current_user_can()restituisce sempre falso se l'utente non ha effettuato l'accesso e wp_get_current_user()restituirà un utente senza alcun ruolo se l'utente non ha effettuato l'accesso, quindi array_intersect()sarà sempre falso.
gmazzap

1
Nel PHPDoc della current_user_can()funzione, possiamo vedere la riga " Mentre il controllo contro determinati ruoli al posto di una capacità è supportato in parte, questa pratica è scoraggiata in quanto può produrre risultati inaffidabili ". Quindi penso che sarebbe meglio evitare di usare i ruoli durante il controllo delle capacità di un utente :-)
Erenor Paz

Quando uso il array_intersectmetodo, ricevo un avviso PHP nel nostro registro degli errori del server che dice array_intersect(): Argument #2 is not an array. Questo perché gli utenti che stanno controllando hanno un solo ruolo?
Garconis,

@Garconis normalmente dovrebbe essere un array. Per qualche motivo sembra che non sia un array. array_intersect($allowed_roles, (array)$user->roles )funzionerà senza problemi.
gmazzap

9

Innanzitutto, current_user_can()non dovrebbe essere utilizzato per verificare il ruolo di un utente, ma dovrebbe essere utilizzato per verificare se un utente ha una capacità specifica .

In secondo luogo, invece di occuparsi del ruolo dell'utente ma concentrandosi invece sulle capacità, non devi preoccuparti di fare cose come il problema posto nella domanda originale (che sta verificando se l'utente è un amministratore O un editore). Invece, se current_user_can()fosse utilizzato come previsto, ovvero verificare le capacità di un utente, non il ruolo, non sarebbe necessario il controllo condizionale per contenere un test "o" (||). Per esempio:

if ( current_user_can( 'edit_pages' ) ) { ...

edit_pages è una funzionalità di entrambi i ruoli di amministratore ed editore, ma non di ruoli inferiori come gli autori. Ecco come current_user_can()doveva essere usato.


Nota : gli sviluppatori WP di alto livello concordano con questa risposta. Dovresti cercare di evitare il più possibile il controllo dei ruoli, usa le capacità. Attualmente sto lavorando a un progetto con più ruoli che hanno solo il limite di "lettura". L'unica soluzione è il controllo dei ruoli per me. Spiacenti, non riesco a trovare il link, è stata una discussione aperta sul WP Github.
Bjorn,

Questa dovrebbe essere la risposta accettata, IMO. current_user_candovrebbe essere generalmente usato per le capacità, non per i ruoli.
Armstrongest

2

Come indicato dalla risposta di @butlerblog, non è necessario utilizzare current_user_can per verificare un ruolo

Questo avviso è specificamente aggiunto nella documentazione della has_capfunzione PHP che viene chiamata dacurrent_user_can

Mentre il controllo contro un ruolo al posto di una capacità è supportato in parte, questa pratica è scoraggiata in quanto può produrre risultati inaffidabili.

Il modo CORRETTO per farlo è ottenere l'utente e controllare $user->roles, in questo modo:

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ) {

        $user = get_userdata( get_current_user_id() );
        if( ! $user || ! $user->roles ){
            return false;
        }

        if( is_array( $role ) ){
            return array_intersect( $role, (array) $user->roles ) ? true : false;
        }

        return in_array( $role, (array) $user->roles );
    }
}

Ecco alcune funzioni di supporto che uso per fare questo (poiché a volte non voglio solo l'utente corrente):

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ){
        return user_has_role_by_user_id( get_current_user_id(), $role );
    }
}

if( ! function_exists( 'get_user_roles_by_user_id' ) ){
    function get_user_roles_by_user_id( $user_id ) {
        $user = get_userdata( $user_id );
        return empty( $user ) ? array() : $user->roles;
    }
}

if( ! function_exists( 'user_has_role_by_user_id' ) ){
    function user_has_role_by_user_id( $user_id, $role ) {

        $user_roles = get_user_roles_by_user_id( $user_id );

        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

        return in_array( $role, $user_roles );
    }
}

Quindi puoi semplicemente fare questo:

current_user_has_role( 'editor' );

o

current_user_has_role( array( 'editor', 'administrator' ) );


-1
<?php if( current_user_can('editor')) :
  echo "welcome";
elseif( current_user_can('member')) :
  echo "welcome";
else :
 wp_die("<h2>To view this page you must first <a href='". wp_login_url(get_permalink()) ."' title='Login'>log in</a></h2>");
endif;
?>

1
Sarebbe bello se tu potessi spiegare come aiuta OP.
bravokeyl,

Puoi consentire di vedere solo la pagina "editor" o "membro", puoi pubblicare questo codice direttamente in generic-page.php
seowmx,

5
Per favore, non rilasciare il codice. Aggiungi commenti e alcune spiegazioni su come questo risolve il problema dei richiedenti.
Kraftner,

Quindi la tua risposta è la duplicazione del codice per ogni ruolo?
Julix
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.