Monthly Archives :

január 2024

WordPress egyedi felhasználói szintek és admin felületre belépés utáni alapértelmezett oldal megváltoztatása

WordPress egyedi felhasználói szintek és admin felületre belépés utáni alapértelmezett oldal megváltoztatása 960 600 bacsoa

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.