current_user_can în WordPress

Securitate WordPress 2.0

Verifică dacă utilizatorul conectat are un anumit drept (capability), de exemplu manage_options sau edit_post pentru un articol.

Sintaxă
current_user_can( string $capability, mixed ...$args ): bool

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&#038;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 init sau 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().