admin_menu în WordPress

Hooks folosite des WordPress 1.5.0

Acțiunea în care adaugi pagini și submeniuri în panoul de administrare, cu add_menu_page() și add_submenu_page().

Sintaxă
do_action( 'admin_menu', string $context )
add_menu_page( string $page_title, string $menu_title, string $capability, string $menu_slug, callable $callback = '', string $icon_url = '', int|float $position = null ): string
add_submenu_page( string $parent_slug, string $page_title, string $menu_title, string $capability, string $menu_slug, callable $callback = '', int|float $position = null ): string|false

Ce face admin_menu

admin_menu rulează în administrare, după ce structura de bază a meniului există, și este locul în care adaugi pagini noi. Documentația precizează că admin_init rulează după admin_menu, deci paginile nu se adaugă din admin_init. Pentru rețelele multisite, meniul de rețea are hook-ul network_admin_menu.

add_menu_page() creează un element de nivel superior (cu pictogramă și poziție) și întoarce sufixul hook-ului paginii (de exemplu toplevel_page_dex-rezervari). add_submenu_page() pune o pagină sub un meniu existent: al tău sau unul al WordPress, dat prin numele fișierului (options-general.php, tools.php, edit.php?post_type=page). Parametrul $position al lui add_submenu_page() există din WordPress 5.3.0.

$capability decide cine vede elementul în meniu, dar documentația cere ca funcția care afișează pagina să verifice și ea dreptul utilizatorului. Ambele funcții există din WordPress 1.5.0.

Parametri

Parametru Descriere
$context Parametrul acțiunii admin_menu: un text gol, fără rol practic.
$page_title Textul din <title> când pagina este deschisă.
$menu_title Textul afișat în meniu.
$capability Dreptul necesar pentru a vedea elementul, de exemplu manage_options sau edit_posts.
$menu_slug Identificator unic; doar litere mici, cifre, cratime și liniuțe de subliniere (compatibil cu sanitize_key()). Apare în URL: admin.php?page=dex-rezervari.
$callback Funcția care afișează conținutul paginii.
$icon_url Doar la add_menu_page(): o clasă Dashicons (dashicons-calendar-alt), un SVG codat base64 (data:image/svg+xml;base64,...) sau 'none'.
$position Poziția în meniu (număr). Implicit null: la sfârșit.
$parent_slug Doar la add_submenu_page(): slug-ul meniului părinte sau fișierul unei pagini WordPress (options-general.php).

Ce returnează

add_menu_page(): sufixul hook-ului paginii (text). add_submenu_page(): sufixul hook-ului sau false dacă utilizatorul nu are dreptul cerut.

Exemple

Exemplul 1: O pagină „Rezervări” în meniul principal

Elementul apare doar administratorilor (manage_options), cu pictograma calendar, după „Comentarii”. Funcția de afișare verifică din nou dreptul.

add_action( 'admin_menu', 'dex_meniu_rezervari' );

function dex_meniu_rezervari() {
    add_menu_page(
        'Rezervări Cafenea Iași',
        'Rezervări',
        'manage_options',
        'dex-rezervari',
        'dex_pagina_rezervari',
        'dashicons-calendar-alt',
        26
    );
}

function dex_pagina_rezervari() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }
    $azi = 3;
    echo '<div class="wrap">';
    echo '<h1>' . esc_html( get_admin_page_title() ) . '</h1>';
    echo '<p>' . esc_html( "Ai {$azi} rezervări pentru astăzi." ) . '</p>';
    echo '</div>';
}

Ce afișează pagina

<div class="wrap"><h1>Rezervări Cafenea Iași</h1><p>Ai 3 rezervări pentru astăzi.</p></div>

Exemplul 2: Submeniuri: unul propriu și unul sub „Setări”

Primul submeniu cu același slug ca părintele redenumește primul element (altfel s-ar repeta „Rezervări”). Al doilea adaugă o pagină sub Setări.

add_action( 'admin_menu', 'dex_submeniuri' );

function dex_submeniuri() {
    add_submenu_page( 'dex-rezervari', 'Toate rezervările', 'Toate', 'manage_options', 'dex-rezervari', 'dex_pagina_rezervari' );
    add_submenu_page( 'dex-rezervari', 'Program', 'Program', 'manage_options', 'dex-program', 'dex_pagina_program' );

    add_submenu_page( 'options-general.php', 'Setări cafenea', 'Cafenea', 'manage_options', 'dex-setari', 'dex_pagina_setari' );
}

Greșeli frecvente

  • Paginile adăugate din admin_init: acesta rulează după admin_menu, iar paginile nu mai apar sau dau eroarea că nu ai voie să accesezi pagina.
  • Te bazezi doar pe $capability: funcția de afișare (și orice procesare de formular) trebuie să verifice și ea current_user_can().
  • Slug cu majuscule sau spații ('Rezervari Cafenea'): folosește doar litere mici, cifre, - și _.
  • Slug identic cu al altui plugin: paginile se suprascriu. Pune prefixul tău (dex-).

Comenzi înrudite

  • add_action: Leagă o funcție de o acțiune WordPress, ca să ruleze automat când WordPress ajunge în acel punct.
  • current_user_can: Verifică dacă utilizatorul conectat are un anumit drept (capability), de exemplu manage_options sau edit_post pentru un articol.
  • wp_enqueue_scripts: Acțiunea în care adaugi fișierele CSS și JavaScript ale temei sau pluginului pentru partea publică a site-ului.
  • get_option / update_option: Citesc, salvează și șterg setări permanente ale site-ului în tabelul wp_options (Options API).
  • 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.