Ce face current_user_can
current_user_can() (din WordPress 2.0.0) întoarce true dacă utilizatorul curent are dreptul cerut. Drepturile vin din rol: administratorul are manage_options, editorul are edit_others_posts, autorul publish_posts, colaboratorul edit_posts, abonatul read. Pentru vizitatori neconectați întoarce false.
Unele drepturi sunt „meta capabilities” și primesc ID-ul obiectului: current_user_can( 'edit_post', 42 ) verifică dacă poți edita exact articolul 42 (un autor își poate edita articolele proprii, nu și pe ale altora). WordPress le traduce în drepturi de bază prin map_meta_cap(). Argumentul variadic ...$args a fost formalizat în 5.3.0, iar din 5.8.0 funcția apelează user_can().
Documentația descurajează verificarea după numele rolului (current_user_can( 'editor' )), pentru că rezultatele pot fi nesigure: verifică un drept. Pe multisite, super-administratorii primesc true pentru aproape orice drept.
Parametri
| Parametru | Descriere |
|---|---|
$capability |
Numele dreptului: manage_options, edit_posts, edit_post, delete_post, upload_files etc. |
...$args |
Argumente suplimentare, de obicei ID-ul obiectului pentru meta capabilities (edit_post, delete_post, edit_user). |
Ce returnează
true dacă utilizatorul curent are dreptul, false altfel.
Exemple
Exemplul 1: Un link afișat doar administratorilor
Linkul către setările pluginului apare doar dacă utilizatorul are manage_options.
<?php
function dex_link_setari() {
if ( current_user_can( 'manage_options' ) ) {
echo '<p><a href="' . esc_url( admin_url( 'admin.php?page=dex-setari' ) ) . '">Setări cafenea</a></p>';
}
}
add_action( 'wp_footer', 'dex_link_setari' );
Ce afișează pagina
<p><a href="https://exemplu.ro/wp-admin/admin.php?page=dex-setari">Setări cafenea</a></p>
Exemplul 2: Drept pe un articol anume
edit_post cu ID-ul articolului: autorul Mihai vede linkul doar la articolele lui.
<?php
function dex_link_editare( $continut ) {
$id = get_the_ID();
if ( current_user_can( 'edit_post', $id ) ) {
$continut .= '<p><a href="' . esc_url( get_edit_post_link( $id ) ) . '">Editează</a></p>';
}
return $continut;
}
add_filter( 'the_content', 'dex_link_editare' );
Ce afișează pagina
<p><a href="https://exemplu.ro/wp-admin/post.php?post=42&action=edit">Editează</a></p>
Exemplul 3: Ce întoarce pentru roluri diferite
Cu WP-CLI rulăm aceeași verificare ca utilizatori diferiți (–user); var_export afișează rezultatul boolean.
wp eval 'var_export( current_user_can( "manage_options" ) );' --user=ana
wp eval 'var_export( current_user_can( "manage_options" ) );' --user=mihai
Ieșire în terminal
true
false
Greșeli frecvente
- Să verifici rolul (
'administrator','editor') în loc de un drept: documentația o descurajează, iar rolurile personalizate nu se potrivesc. current_user_can( 'edit_post' )fără ID: pentru meta capabilities ID-ul e necesar, altfel rezultatul nu e cel așteptat.- Să ascunzi doar butonul, dar să nu verifici dreptul și în codul care procesează cererea: oricine poate trimite cererea direct.
- Apelul prea devreme (înainte ca utilizatorul să fie încărcat, de exemplu direct la încărcarea pluginului): folosește-l în hook-uri ca
initsau mai târziu.
Comenzi înrudite
check_admin_referer: Verifică nonce-ul unei cereri din administrare și oprește execuția cu o pagină de eroare dacă e invalid sau a expirat.wp_nonce_field: Adaugă într-un formular un câmp ascuns cu un nonce, un cod care dovedește că cererea pornește chiar de pe site-ul tău.register_rest_route: Înregistrează un endpoint propriu în REST API-ul WordPress, accesibil la o adresă de forma /wp-json/dex/v1/meniu.admin_menu: Acțiunea în care adaugi pagini și submeniuri în panoul de administrare, cu add_menu_page() și add_submenu_page().