Se l'utente corrente è un amministratore o un editore

30 gen 2014, 16:08:32
Visualizzazioni: 429K
Voti: 167

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

So come fare ciascun controllo individualmente:

<?php if(current_user_can('editor')) { ?> 
    <!-- Contenuto qui per gli editori -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Contenuto qui per gli amministratori -->
<?php } ?>

Ma come posso combinare questi controlli insieme? Cioè, verificare se l'utente è un amministratore o un editore?

1
Commenti

if( current_user_can('editor') || current_user_can('administrator') )

Shazzad Shazzad
30 gen 2014 16:10:02
Tutte le risposte alla domanda 6
7
318

Prima risposta, non correlata a WordPress poiché riguarda solo PHP: Utilizza l'operatore logico "OR":

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Contenuto qui per amministratori o editor
<?php } ?>

Se vuoi controllare più di due ruoli, puoi verificare se i ruoli dell'utente corrente sono presenti in un array di ruoli, qualcosa del genere:

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Contenuto qui per i ruoli autorizzati
<?php } ?>

Tuttavia, current_user_can può essere utilizzato non solo con i nomi dei ruoli utente, ma anche con le capabilities.

Quindi, dato che sia gli editor che gli amministratori possono modificare le pagine, il tuo lavoro può essere più semplice controllando queste capabilities:

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Contenuto qui per i ruoli utente che possono modificare le pagine: editor e amministratori
<?php } ?>

Dai un'occhiata qui per maggiori informazioni sulle capabilities.

30 gen 2014 16:16:14
Commenti

hai bisogno di controllare se is_logged_in(); ?

RobBenz RobBenz
1 mag 2017 14:09:58

@RobBenz no, in nessuno dei casi. Perché current_user_can() restituisce sempre false 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 false.

gmazzap gmazzap
1 mag 2017 21:46:24

Nel PHPDoc della funzione current_user_can(), possiamo vedere la riga "Mentre il controllo dei ruoli specifici al posto di una capability è parzialmente supportato, questa pratica è sconsigliata in quanto potrebbe produrre risultati inaffidabili". Quindi penso che sarebbe meglio evitare di utilizzare i ruoli durante il controllo delle capability di un utente :-)

Erenor Paz Erenor Paz
1 set 2017 12:58:24

Quando uso il metodo array_intersect, ricevo un avviso PHP nel log degli errori del server che dice array_intersect(): Argument #2 is not an array. È perché l'utente(i) che sta controllando ha un solo Ruolo?

Garconis Garconis
23 gen 2018 16:44:54

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

gmazzap gmazzap
25 gen 2018 09:02:14

Consiglio di non controllare i ruoli... ma piuttosto le capabilities. È più facile rimuovere o aggiungere una capability a un insieme di ruoli... è più esplicito. current_user_can('edit_orderform') per esempio... forse un Rappresentante Commerciale dovrebbe SOLO essere in grado di modificare il modulo d'ordine... ma non avere i diritti per aggiungere contenuti. Concedere esplicitamente quella capability è una struttura di permessi più esplicita rispetto al ruolo che ha un utente. Le persone ricoprono più ruoli nelle organizzazioni più grandi. Puoi avere abbonati che hanno più accesso della sola lettura.

Armstrongest Armstrongest
14 mag 2019 00:42:05

+1 non capisco perché le persone si infuriano contro l'uso di current_user_can per controllare i ruoli. È documentato nelle API come utilizzo legittimo, fine della storia. È intelligente farlo? Dipende dal contesto

Mark Kaplun Mark Kaplun
27 set 2021 08:21:03
Mostra i restanti 2 commenti
11
21

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

In secondo luogo, invece di preoccuparsi del ruolo dell'utente ma concentrandosi sulle capacità, non è necessario occuparsi di fare cose come quelle richieste nella domanda originale (che consiste nel verificare se l'utente è un amministratore O un editor). Piuttosto, se current_user_can() venisse utilizzato come previsto, cioè per verificare le capacità di un utente, non il loro ruolo, non sarebbe necessario che il controllo condizionale contenga un test "or" (||). Per esempio:

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

edit_pages è una capacità che appartiene sia al ruolo di amministratore che a quello di editor, ma non ai ruoli inferiori come gli autori. Questo è il modo in cui current_user_can() è stato pensato per essere utilizzato.

6 gen 2019 05:23:19
Commenti

Nota bene: Gli sviluppatori WordPress di alto livello concordano con questa risposta. Dovresti cercare di evitare il più possibile il controllo dei ruoli e utilizzare invece i permessi. Attualmente sto lavorando su un progetto con ruoli multipli che hanno solo il permesso 'read'. Per me l'unica soluzione è il controllo dei ruoli. Mi dispiace, non riesco a trovare il link, era una discussione aperta su Github di WordPress.

Bjorn Bjorn
27 apr 2019 00:44:38

Questa dovrebbe essere la risposta accettata, secondo me. current_user_can dovrebbe essere generalmente utilizzato per i permessi, non per i ruoli.

Armstrongest Armstrongest
14 mag 2019 00:43:30

+1 a questo, evita di controllare i ruoli tramite current_user_can(). Se vuoi controllare i ruoli per chiave, esegui un controllo del ruolo invece di un controllo dei permessi :)

William Patton William Patton
5 mar 2020 13:43:13

Qual è quindi la funzione corretta per controllare i ruoli degli utenti in modo esplicito e sicuro? Sembra che sia un po' difficile da trovare (se esiste). @Bjorn

Viktor Borítás Viktor Borítás
15 apr 2020 11:26:55

@Viktor Borítás Ci sono diverse soluzioni valide in questa pagina. Ma usale solo se current_user_can() non è un'opzione. Inoltre, il mio commento è più orientato alla sicurezza. Per esempio, se vuoi limitare i contenuti per utenti specifici, nella maggior parte dei casi un controllo delle capacità è sufficiente per questo compito.

Bjorn Bjorn
16 apr 2020 16:21:43

È preferibile utilizzare le capacità "per proteggere" le operazioni perché sono più flessibili, più facili da filtrare e da assegnare agli utenti in modo granulare. Ma se la domanda a cui si cerca risposta è "L'utente corrente è un editor?" allora usare current_user_can va perfettamente bene, anzi, è esattamente il modo in cui si dovrebbe usare.

gmazzap gmazzap
18 mar 2021 20:55:11

@gmazzap - in realtà, utilizzare current_user_can() per controllare un ruolo non è "perfettamente corretto". Se lo fosse, perché la documentazione della funzione dovrebbe dire "questa pratica è sconsigliata poiché potrebbe produrre risultati inaffidabili". Il fatto che qualcosa "funzioni" non significa che sia una buona pratica o una pratica accettabile. Internet è già pieno di cattive pratiche di programmazione presentate come accettabili. Per favore non aggiungerne altre.

butlerblog butlerblog
13 apr 2021 20:16:12

@butlerblog sai che il Codex è scritto da contributori? Programmo per WordPress da 16 anni, e con il numero di errori che ho trovato nel Codex in questi anni potrei scrivere un libro. Detto questo, non è un errore ma è scritto male. Come ho già scritto, la pratica è sconsigliata per rispondere alla domanda: "l'utente corrente ha il permesso di fare X?" perché se questo è ciò che devi verificare, controllare il ruolo produrrà risultati inaffidabili. Ma se vuoi rispondere alla domanda "Questo utente ha il ruolo X?", che è una domanda diversa, allora current_user_can() è il modo corretto da utilizzare.

gmazzap gmazzap
16 apr 2021 15:33:46

Non mi riferisco al codex. Non solo il codex è tecnicamente deprecato, ma ciò di cui stiamo parlando proviene direttamente dalla documentazione inline nel Core ed è presente nella documentazione per sviluppatori, che ha una supervisione considerevolmente maggiore rispetto al codex. Inoltre, incoraggiare l'uso di questa funzione in questo modo porta ad altre cattive abitudini nell'uso improprio di ruoli vs capabilities, esempi dei quali abbondano in rete. Sei libero di avere la tua opinione, ma dovremo concordare di essere in disaccordo.

butlerblog butlerblog
17 apr 2021 20:38:22

Mi scusi, se questo è tecnicamente deprecato, qual è il modo che si usa in WordPress per verificare se un utente ha un ruolo? @butlerblog Nota che non sto chiedendo qual è il modo per verificare se un utente è autorizzato a eseguire un'operazione, ma - di nuovo - per verificare se un utente ha un ruolo o meno.

gmazzap gmazzap
31 ott 2022 11:34:56

Quando ho detto "tecnicamente deprecato", mi riferivo specificamente al tuo riferimento al codex. L'uso di current_user_can() non è deprecato - non è mai stato pensato per essere usato per verificare un ruolo - è così da WordPress 2.0, ed è annotato nel codice e nella documentazione per sviluppatori. Per verificare se un utente ha un ruolo (cosa per cui non c'è quasi mai un buon motivo), è un array nell'oggetto: $user->roles. Per esempio: in_array( 'some_role', $user->roles ); Ma controllare i ruoli porta a cattive abitudini. I ruoli sono pensati per assegnare in blocco un gruppo di capacità a un utente, è la capacità che dovrebbe essere verificata.

butlerblog butlerblog
2 nov 2022 17:42:47
Mostra i restanti 6 commenti
5

Come affermato nella risposta di @butlerblog, non dovresti usare current_user_can per verificare un ruolo

Questo avviso è specificamente aggiunto nella documentazione PHP della funzione has_cap che viene chiamata da current_user_can

Sebbene il controllo di un ruolo al posto di una capability sia parzialmente supportato, questa pratica è sconsigliata in quanto potrebbe 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 ) {
        // Ottiene i dati dell'utente corrente
        $user = get_userdata( get_current_user_id() );
        if( ! $user || ! $user->roles ){
            return false;
        }

        // Controlla se il ruolo è un array
        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 ) {
        // Ottiene i dati dell'utente tramite 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 ) {
        // Ottiene i ruoli dell'utente
        $user_roles = get_user_roles_by_user_id( $user_id );

        // Controlla se il ruolo è un array
        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

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

Quindi puoi semplicemente fare così:

current_user_has_role( 'editor' );

oppure

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

26 ago 2019 21:21:50
Commenti

L'accesso alle proprietà di basso livello non è mai una buona idea in WP, sicuramente non è il modo corretto. Se la domanda a cui si cerca risposta è "L'utente corrente è un editor?" allora usare current_user_can va perfettamente bene, in effetti, è esattamente la strada da seguire. Il fatto che sia preferibile utilizzare le capability per "proteggere" le operazioni è un argomento diverso. Conoscere il ruolo di un utente potrebbe essere una cosa legittima, e in quel caso, current_user_can è perfettamente appropriato da usare.

gmazzap gmazzap
18 mar 2021 20:59:27

@gmazzap allora perché nella pagina della documentazione di current_user_can si dice specificamente "Mentre il controllo contro ruoli specifici al posto di una capability è supportato in parte, questa pratica è sconsigliata in quanto potrebbe produrre risultati inaffidabili." Sembra che la documentazione e il tuo commento siano in contraddizione, anche se capisco quello che stai dicendo. Detto questo, $roles è una proprietà pubblica dell'oggetto WP_User ed è così dalla versione 2.0.0. https://developer.wordpress.org/reference/functions/current_user_can/

sMyles sMyles
18 mar 2021 21:32:05

la documentazione si riferisce al fatto che, per esempio, un editor è solitamente in grado di modificare i post. Quindi potresti essere tentato di verificare se l'utente è un editor per consentirgli di modificare un post. Questo è sbagliato perché magari la capability è stata filtrata in modo che l'utente, nonostante sia un editor, non dovrebbe modificare il post. E può accadere anche il contrario, un subscriber potrebbe essere autorizzato a modificare i post o solo quel post specifico. Controllare la capability assicura che questi risultati attesi siano rispettati.

gmazzap gmazzap
31 mar 2021 09:46:13

Detto questo, chiedere "Questo utente è un editor?" potrebbe essere ancora una domanda legittima. Non dovresti chiederlo per determinare se un utente è autorizzato o meno a fare qualcosa, ma potresti porre quella domanda per qualche altro motivo. E in tal caso, allora current_user_can con il nome del ruolo va benissimo.

gmazzap gmazzap
31 mar 2021 09:47:39

Per quanto riguarda i ruoli, sì, è una proprietà pubblica su cui puoi fare affidamento, ma current_user_can ha dei filtri, per esempio, https://developer.wordpress.org/reference/hooks/user_has_cap/ o https://developer.wordpress.org/reference/hooks/map_meta_cap/. Se un plugin o qualsiasi altra cosa sta usando questi filtri per modificare ciò che current_user_can restituisce, controllando direttamente la proprietà dei ruoli perderai i filtri, e quindi ridurrai la compatibilità del tuo codice con il codice di altri.

gmazzap gmazzap
31 mar 2021 09:56:06
0

Per amministratore

$current_user = wp_get_current_user();
if (!in_array('administrator', $current_user->roles)) {
   //esegui qualcosa
}

Per editore

$current_user = wp_get_current_user();
if (!in_array('editor', $current_user->roles)) {
      //esegui qualcosa
}

Si noti che funziona solo se si vogliono controllare i ruoli dell'utente corrente. Se è necessario controllare qualsiasi altro utente specifico, è necessario utilizzare get_user_by (https://developer.wordpress.org/reference/functions/get_user_by/) o metodi simili per recuperare l'utente che si desidera controllare

22 mag 2023 10:09:37
4
-2
<?php if( current_user_can('editor')) :
  // Messaggio di benvenuto per l'editor
  echo "benvenuto";
elseif( current_user_can('member')) :
  // Messaggio di benvenuto per il membro
  echo "benvenuto";
else :
  // Messaggio di errore per utenti non autorizzati 
  wp_die("<h2>Per visualizzare questa pagina devi prima <a href='". wp_login_url(get_permalink()) ."' title='Accedi'>accedere</a></h2>");
endif;
?>
29 set 2016 20:26:21
Commenti

Sarebbe ottimo se potessi spiegare come aiuta l'autore della domanda.

bravokeyl bravokeyl
29 set 2016 20:32:54

Puoi consentire la visualizzazione della pagina solo a "editor" o "member" inserendo questo codice direttamente in generic-page.php

seowmx seowmx
29 set 2016 20:36:28

Per favore non limitarti a pubblicare solo il codice. Aggiungi commenti e una spiegazione su come questo risolve il problema di chi ha fatto la domanda.

kraftner kraftner
29 set 2016 21:09:04

Quindi la tua risposta è la duplicazione del codice per ogni ruolo?

Julix Julix
22 ott 2019 20:20:47
2
-3

Le risposte corrette alla domanda di cui sopra sono per la programmazione di base else:

if( current_user_can('administrator')) { 

<!-- solo l'amministratore vedrà questo messaggio -->

} else { 

        if( wp_get_current_user('editor')) {

<!-- solo l'editor ma non l'amministratore vedrà questo messaggio -->

?>
<style type="text/css">#perhapsDIVremovalidentifier{
display:none;
</style>
}
<?php
} else {

<!-- l'utente non è né editor né amministratore -->

}}  

In breve: L'amministratore viene rilevato, ma se cerchiamo l'editor viene rilevato anche l'amministratore. Quindi permettiamo solo all'amministratore di passare e identifichiamo solo l'editor.

Ricorda che dovresti sempre utilizzare questo codice per richiamare quello sopra per minimizzare l'utilizzo della CPU:

if(is_user_logged_in()){}
3 giu 2020 22:18:43
Commenti

Questo è esattamente ciò che è indicato nella domanda, e ciò che l'autore non vuole.

fuxia fuxia
4 giu 2020 00:15:03

Ho aggiunto brevemente così da non avere malintesi. Era difficile seguire le altre regole credo.

Dealazer Dealazer
4 giu 2020 11:52:43