Verifică dacă utilizatorul este administrator după ID-ul utilizatorului

27 aug. 2016, 14:40:39
Vizualizări: 20.1K
Voturi: 10

Aveți idei despre cum să verificați dacă un utilizator (după ID-ul utilizatorului) este administrator? Nu mă refer la utilizatorul curent autentificat.

// Metoda 1 - Folosind user_can()
$user_id = 123; // ID-ul utilizatorului de verificat
if ( user_can( $user_id, 'administrator' ) ) {
    echo 'Utilizatorul este administrator';
}

// Metoda 2 - Verificarea directă a rolurilor
$user = get_userdata( $user_id );
if ( $user && in_array( 'administrator', (array) $user->roles ) ) {
    echo 'Utilizatorul este administrator';
}
2
Comentarii

user_can( $user_id, "manage_options" ) sau in_array( "administrator", get_userdata( $user_id ) ). is_admin() indică dacă te afli în ecranul de administrare (dashboard etc)

Ismail Ismail
27 aug. 2016 15:02:26

@SamuelElh ca răspuns, te rog. :)

Rarst Rarst
27 aug. 2016 15:43:44
Toate răspunsurile la întrebare 3
0
21

Ai formulat-o ca și cum ai vrea să verifici dacă utilizatorul are rolul de administrator. Este considerat mai corect să verifici abilitatea, relevantă pentru acțiunea specifică.

În practică, aceasta este de obicei exprimată ca current_user_can( 'manage_options' ) pentru utilizatorul curent. Pentru un utilizator arbitrar, ar fi user_can( $user_id, 'manage_options' ).

Desigur, aceasta este o abilitate care reprezintă configurația generală a site-ului. În funcție de scopul tău, poți dori să folosești una diferită, vezi lista în documentația despre roluri și abilități.

27 aug. 2016 15:49:19
2

Doar adaug la răspunsul lui @Rarst.

Tehnic, poți furniza numele rolului acelor funcții, deci current_user_can( 'administrator' ) sau user_can( $user_id, 'administrator' ) ar funcționa și ele, dar acest lucru este discurajat.

Deși verificarea împotriva anumitor roluri în locul unei capabilități este parțial acceptată, această practică este descurajată deoarece poate produce rezultate nesigure.

Notă: Va returna întotdeauna true dacă utilizatorul curent este un super admin, cu excepția cazului în care este specific interzis.

Ai putea verifica rolul fără a te baza pe acele funcții (deoarece acestea sunt nesigure), dar cum a spus @Rarst, este mai corect să verifici capabilități în loc de rol.

Unul dintre principalele avantaje ale utilizării capabilităților în locul rolurilor este următorul.

De exemplu, să presupunem că ai mai mult de un administrator pe site-ul tău. Să spunem că vrei ca clientul tău să fie admin, iar tu ești de asemenea admin al site-ului.

Acum are sens ca clientul tău să aibă privilegii de administrator pe site-ul său, dar s-ar putea să nu vrei ca el/ea să aibă posibilitatea de a instala pluginuri pe site. Aceasta ar fi treaba ta ca webmaster.

Deci dacă verifici rolurile, ești blocat la dezactivarea/activarea funcționalităților pentru toți cei din acel rol.

Dacă folosești capabilități, ai o granularitate mai mare în acordarea/restricționarea utilizatorilor pentru acțiuni specifice.

Revenind la scenariul meu, dacă vrei să-i oferi clientului tău privilegii de administrator dar să nu poată instala pluginuri, ar fi la fel de simplu ca

add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){

  // capabilitatea cerută și ID-ul clientului nostru 
  if ( 'install_plugins' == $args[0] && $args[1] == 2 ) 
    $allcaps[ $cap[0] ] = false;
  
  return $allcaps;
}

am putea furniza o listă de diferite capabilități pe care am vrea să le restricționăm, de exemplu update_core, manage_options, install_plugins, install_themes etc.

Funcția noastră ar rămâne destul de simplă

add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){

  $restricted_cap = array( 
    'update_core',
    'manage_options',
    'install_plugins',
    'install_themes',
     // etc.
  );

  foreach( $restricted_cap as $r_cap ){

    // capabilitatea cerută și ID-ul clientului nostru 
    if ( $r_cap == $args[0] && $args[1] == 2 ) 
      $allcaps[ $cap[0] ] = false;

  } 
  
  return $allcaps;
}

După cum poți vedea, acest lucru este destul de eficient, nu necesită un rol special, nu adaugă o interogare suplimentară la baza de date, este executat la runtime și este ușor de scalat și întreținut.

Dacă logica ta depinde de un rol, atunci succes înțelegând utilizatori specifici, scenarii sau orice altceva fără a-ți smulge părul sau a crea o mulțime de roluri doar pentru a ține pasul cu toate cazurile posibile de utilizare.

Consultă codex-ul pentru mai multe informații despre filtrul user_has_cap.

31 aug. 2016 07:38:33
Comentarii

"Deși verificarea în funcție de anumite roluri în locul unei capabilități este parțial acceptată, această practică este descurajată deoarece poate produce rezultate nesigure." -> https://developer.wordpress.org/reference/functions/current_user_can/

cybmeta cybmeta
31 aug. 2016 07:53:08

Bună observație, am actualizat răspunsul meu pentru a include citatul

bynicolas bynicolas
31 aug. 2016 08:02:31
0

Poți utiliza get_userdata() sau get_user_by() prin transmiterea ID-ului utilizatorului pentru a obține obiectul utilizator. Din acesta poți extrage rolul.

$user = get_userdata( $user_id );
if(!empty( $user ) && $user){
   $user->roles // aici se află rolul, verifică pentru orice rol ai nevoie
}

Poți consulta acest răspuns pentru mai multe informații

27 aug. 2016 14:57:05