Menüpont elrejtése és letiltása bizonyos felhasználói szerepkör esetén WordPressben előnézeti képe

Menüpont elrejtése és letiltása bizonyos felhasználói szerepkör esetén WordPressben

| Olvasási idő: 2 perc

Korábban már írtam az egyedi felhasználói szerepkörök kialakításáról, ahogyan arról is, hogy hogyan tudunk egyedi menüpontot hozzáadni a WordPress admin felületéhez - arról azonban eddig nem volt szó, hogy hogyan tudunk elrejteni/letiltani bizonyos menü elemeket. 

Egy lehetséges út a fenti problémára az, ha átalakítjuk a jogosultsági szintek "tartalmát" - ehhez jól kell ismerni a WordPress belső működését, az egyes funkciókhoz szükséges képességeket - egyszóval ez egy kicsit bonyolult útnak tűnik csak azért, hogy egy 2-3 szerkesztővel rendelkező oldalon elrejtsünk néhány menüpontot. Ennél eggyel könnyebb út az, ha 

  • kivesszük a menüből a tiltani kívánt menüpontokat és
  • tiltjuk az azokhoz történő hozzáférést URL alapján.

Erre szerencsére létezik emberi méretű snippet is - illesszük be tehát az alábbi kódrészletet az mu-plugins mappában létrehozott restrict-user-access.php fájlba: 

php
<?php
/*
Plugin Name: Hide and disable menu item(s)
Plugin URI: https://www.webmenedzser.hu
Description: Hide and disable menu items from users depending on their roles
Version: 1.0
Author: Radics Ottó
Author URI: https://www.webmenedzser.hu
License: GPLv3
*/

function hide_admin_menu_items() {
    if (!current_user_can( 'manage_options' )) {
        // Hide a complete main menu item
        remove_menu_page('profile.php');

        // Hide a specific submenu item
        remove_submenu_page( 'tools.php', 'export.php' );
    }
}
add_action('admin_init', 'hide_admin_menu_items');

A fenti kódrészletben két menüpontot rejtünk el akkor, ha a felhasználó nem rendelkezik a manage_options képességgel: a személyes profilra mutatót a bal oldali oldalsávból, valamint az Eszközök => Exportálás almenüpontot. A kettőre két különböző függvény szolgál: a főmenü elem elrejtéséhez elég ismerni az adott oldalhoz tartozó php fájl nevét (ezt a menüpontra kattintva megtaláljuk a címsorban - ebben az esetben /wp-admin/profile.php), almenü esetében viszont azt is tudnunk kell, hogy a szülő elemének mi a "neve" (vagyis itt kettő kattintásra lesz szükségünk: /wp-admin/tools.php és /wp-admin/export.php). Frissítést követően látjuk, hogy a menüpontok eltűnnek (feltéve, hogy nem rendelkezik a tesztelt felhasználó a fent már említett képességgel), azonban ha a címsorba beírjuk a pontos címet, akkor még oda tudunk navigálni. Bővítsük tehát a fenti snippetet az alábbi módon: 

php
<?php
/*
Plugin Name: Hide and disable menu item(s)
Plugin URI: https://www.webmenedzser.hu
Description: Hide and disable menu items from users depending on their roles
Version: 1.0
Author: Radics Ottó
Author URI: https://www.webmenedzser.hu
License: GPLv3
*/

function hide_admin_menu_items() {
    if (!current_user_can( 'manage_options' )) {
        // Hide a complete main menu item
        remove_menu_page('profile.php');

        // Hide a specific submenu item
        remove_submenu_page( 'tools.php', 'export.php' );
    }
}
add_action('admin_init', 'hide_admin_menu_items');

function disable_admin_menu_items() {
    if (!current_user_can( 'manage_options' )) {
        // Set restricted pages
        $restrictions = array(
            '/wp-admin/profile.php',
            '/wp-admin/export.php'
        );

        // Check if the user tries to visit one of the restricted pages
        foreach ( $restrictions as $restriction ) {
            if ( ! current_user_can( 'manage_options' ) && $_SERVER['PHP_SELF'] == $restriction ) {
                wp_redirect( admin_url() );

                exit;
            }
        }
    }
}
add_action( 'admin_init', 'disable_admin_menu_items' );

A bővített kód már "ellenőrzi" is a jogosultságot, a következőképpen: egy tömbben meghatározunk tiltott útvonalakat, majd ezeken iterálva (végigmenve) ellenőrizzük, hogy a felhasználó rendelkezik-e a megfelelő jogosultsággal ÉS a kérés az éppen vizsgált tömbelemre érkezik-e (tehát hogy a felhasználó a /wp-admin/profile.php-t próbálja-e megnyitni) - amennyiben az elsőre a válasz nem, a másodikra pedig igen, akkor a rendszer átirányít a Vezérlőpultra és megszakítja a jelenlegi kód (vagyis a snippet) futását. 

Nem mondom, hogy ennél tisztább-szárazabb megoldás ne létezne erre a problémára, de a snippet a feladatát elvégzi - amennyiben bonyolultabb rendszert üzemeltetsz, vagy egyedi fejlesztésű összetevőid is vannak, úgy azt javaslom, hogy a jogosultságokra vonatkozó logikát inkább ott implementáld.