2019. 04. 08.
frissítve: 2022. 05. 15.
Olvasási idő: 8 perc
Plugout

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

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:

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:

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.