Egyedi felhasználói szintet kellett létrehozzak és mivel ennek a felhasználó típusnak egy csomó mindent nem szabad látnia, kézen fekvő volt máshova irányítani őt bejelentkezés után, hogy ne is keresgéljen a WordPress vezérlőpulton.
A WordPress admin felületen (hívhatnám egyszerűsítve backendnek is, de azért ez nem teljesen azt jelenti) egy külön világ van, mint a frontenden (amit a látogató lát), külön CSS beállítással, sokszor elkülönített lekérdezésekkel és sok minden mással is. Aki bele akar mélyedni a felhasználói szintekbe, az itt tudja ezt megtenni.
Első lépésben csináljunk egy új felhasználói szintet. Ehhez az add_role metódust használjuk, aminek három paramétere van:
- egyedi azonosító slug (ékezetek és szóköz nélkül), itt organizer
- felhasználó szint neve, ez jelenik majd meg az admin felületen a felhasználóknál, itt Szervező
- jogok, vagyis képességek, hogy az adott felhasználó mihez férhet hozzá, itt az adminisztrátori jogokat kapja meg. Ez egy elég bonyolult képességfa, akit érdekel az összes, az erre nézelődjön
add_role(
'organizer',
__( 'Szervező' ),
get_role( 'administrator' )->capabilities
);
A fenti kód csinál egy ‘organizer’ nevű felhasználói szintet, aki gyakorlatilag egy adminisztrátori jogkörrel (aka képességekkel) rendelkező felhasználótípus.
Sok bővítménnyel, vagy egyedi eszközzel meg lehet azt csinálni, hogy mit lásson ez a felhasználó és mit sem, erre jó például a remove_menu_page, vagy a remove_submenu_page metódusok, de egy sima admin oldali inline CSS-sel is el tudunk tüntetni szinte minden menüt attól függően, hogy ki van bejelentkezve.
$user = wp_get_current_user();
$roles = ( array ) $user->roles;
$role = $roles[0];
// Megvizsgálja, hogy a bejelentkezett felhasználó típusa 'organizer' és ha igen, akkor az azon belüli rész fut le
if ( $role == "organizer" ) {
// Elrejti a felső fekete adminisztrációs sávot
show_admin_bar(false);
// Beállítja az alább megadott inline CSS-t, az admin_head action csak az adminisztrációs felületen érvényes CSS stíluslapokat állítja be, tehát ennek nincs határsa a frontenden lévő sablonra
add_action('admin_head', 'my_custom_css');
function my_custom_css() {
echo '<style>
li#menu-media, li#menu-settings {display:none;}
</style>';
}
// Ez teszi lehetővé, ha a bejelentkezett felhasználó 'organizer' típusú, akkor az itt található két speciális metódusban lévő dolgok fussanak le
add_action( 'admin_init', 'stop_access_profile_organizer' );
add_action( 'admin_enqueue_scripts', 'load_defaults_prevents_organizer' );
}
// Ez a rész megtiltja a hozzáférést néhány admin felületen található oldalhoz. Az előző rész csak elrejti CSS segítségével a menüpontokat, ez viszont azt akadályozza meg, ha valaki szemfüles és tudja az URL-eket fejből és oda próbál menni, akkor egy hibaüzenet kíséretében megtiltja azt
function load_defaults_prevents_organizer($hook)
{
if ( $hook=="options-general.php" || $hook=="options-writing.php" || $hook=="options-reading.php" || $hook=="options-discussion.php" || $hook=="options-media.php" || $hook=="options-permalink.php" || $hook=="tools.php" || $hook=="widgets.php" || $hook=="customize.php" || ($hook=="post-new.php" && $_GET['post_type']=="page") || $hook=="themes.php" ) {
wp_die( 'Nincs jogod megtekinteni ezt az oldalt.' );
}
}
// Ezek le fogják szedni az admin felületről a bal oldalon megjelenő menüpontokat, az első a Megjelenés / Sablonok részt, a második az Oldalak menüt fogja eltüntetni
function stop_access_profile_organizer()
{
remove_menu_page( 'themes.php' );
remove_menu_page( 'edit.php?post_type=page' );
}
Nézzük azt a részt, hogy mit csináljunk az ‘organizer’ típusú felhasználókkal, miután sikeresen bejelentkezett. Mondjuk a Hozzászólások részhez. Ez azért jó, mert így nem egyből a Vezérlőpult részre kerül (ahova alapból mindenki), ahol még vagy 100 minden WordPress telepítésnél más és más részt kell elrejteni, hanem oda, ahova mi akarjuk:
add_action('wp_login', 'ba_new_dashboard_home', 10, 2);
function ba_new_dashboard_home($username, $user)
{
if (array_key_exists('organizer', $user->caps)) {
wp_redirect(admin_url('edit-comments.php', 'http'), 301);
exit;
}
}
Ha nem akarunk annyit inline CSS-ezni, akkor hasznos lehet, ha az ‘organizer’ típusú felhasználók esetén az admin oldal body elem osztályát kiegészítjük valamivel, így könnyebb lesz rá hivatkozni. Erre van egy speciális filter, az admin_body_class nevű. Ez teljesen ugyanazt csinálja, mint a body_class nevű filter, csak míg utóbbi a frontenden módosítja a body tag osztályait, előbb az admin felületen csinálja ugyanezt.
// Hozzáad egy egyedi osztályt a body taghez, ha egy organizer típusú felhasználó van bejelentkezve
add_filter( 'admin_body_class', 'ba_admin_body_classes' );
function ba_admin_body_classes( $classes )
{
$user = wp_get_current_user();
$roles = ( array ) $user->roles;
$user_role = $roles[0];
if ( $user_role == 'organizer' ) {
$classes .= ' logged_organizer ';
}
return $classes;
}
Ez a pár hasznos kódrészlet kiválóan alkalmas arra, hogy 2-5 féle plugin feltelepítése helyett saját kóddal, elegánsan és gyorsan oldjuk meg pontosan azt a problémát, amit akarunk, és ne szemeteljük tele a WordPress oldalunkat szuper, mindent megoldó bloatware pluginokkal.