Jak sprawdzić prawa użytkownika? Czy zalogowany jest administrator? Na te pytanie odpowiemy sobie w tym wpisie. Pierwsze co się nasunie, niestety całkiem sporej, części czytających będzie magiczna funkcja is_admin(). Mam jednak nadzieję, że w tej chwili patrzycie z niedowierzaniem! Oczywiście is_admin() służy do czegoś całkiem innego – do sprawdzania, czy WordPress włącza się w trybie pokazywania stron czy od strony panelu administracyjnego. I tylko tyle. Żadnych dodatkowych wniosków z tej funkcji nie wolno wyciągać.
Zatem, jak sprawdzić, czy zalogowany jest administrator?
Po pierwsze, musimy pozwolić WordPressowi to sprawdzić. Dlatego nie możemy tego kodu wstawić bezpośrednio we wtyczce czy motywie. Musi być załadowany wtedy, kiedy sam WordPress będzie to wiedział. Do realizacji naszego zadania wykorzystamy akcję „set_current_user„. Przyjmijmy, że w tej chwili piszemy do pliku functions.php, który włącza się razem z naszym motywem (ale nic nie stoi na przeszkodzie, aby umieścić to w innym pliku, czy we wtyczce). Dopisujemy do akcji naszą funkcję, którą nazwiemy roboczo „myThemeCheckCurrentUser„.
1 |
add_action('set_current_user', 'myThemeCheckCurrentUser' ); |
Dopisujemy funkcję:
1 2 |
function myThemeCheckCurrentUser() { } |
I właśnie w tej funkcji możemy sobie sprawdzić, jakie prawa ma zalogowany użytkownik. Ponieważ ta akcja może być wywoływana w trakcie logowania, musimy się upewnić, że właśnie nie trwa logowanie, tylko ładujemy stronę po tym procesie. Możemy to zrobić, korzystając z funkcji „is_user_logged_in()„, ale… ona powie nam, czy użytkownik jest zalogowany a nie czy jest administratorem. Może istnieje lepsza metoda? Jasne, że tak. Po prostu pobierzemy sobie instancję obiektu WP_User, która powinna zawierać dane bieżącego użytkownika (lub nie, jeśli użytkownik nie jest zalogowany). Robimy to następująco:
1 2 3 |
function myThemeCheckCurrentUser() { $user = wp_get_current_user(); } |
Co nam to da? Między innymi dostęp do właściwości ID, która będzie równa 0 (zero) o ile użytkownik nie jest zalogowany lub będzie to całkowita wartość dodatnia, ID użytkownika, o ile zalogowany jest. Rozszerzamy więc nasz kod:
1 2 3 4 5 6 7 8 9 10 |
function myThemeCheckCurrentUser() { $user = wp_get_current_user(); if ( 0 === $user->ID ) { /* * użytkownik nie jest zalogowany, nie ma po co sprawdzać, * czy jest administratorem, czy nie... */ return; } } |
Przyjmijmy jednak, że funkcja przeszła ten warunek, użytkownik jest zalogowany. Co dalej? W teorii wystarczy sprawdzić, czy to:
1 |
array_search( 'administrator', $user->roles ) |
zwróci nam false czy też int z numerem indeksu, bo $user->roles to tablica. Należy zwrócić baczną uwagę na porównanie:
1 |
if ( ! array_search( 'administrator', $user->roles ) ) |
prawdopodobnie zwróci nam false przy zalogowanym administratorze. Bo często „administrator” jest pozycją z numerem zero a to, przy braku porównania typu i rzutowanie 0 do boolean… da nam false! Trzeba by napisać:
1 |
if ( false === array_search( 'administrator', $user->roles ) ) |
i wówczas, rzeczywiście, możemy zakończyć, bo użytkownik nie jest administratorem. Całość wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
add_action('set_current_user', 'myThemeCheckCurrentUser' ); function myThemeCheckCurrentUser() { $user = wp_get_current_user(); if ( 0 === $user->ID ) { /* * użytkownik nie jest zalogowany, nie ma po co sprawdzać, * czy jest administratorem, czy nie... */ return; } if ( false === array_search( 'administrator', $user->roles ) ) { /* jak wyżej */ return; } /* * Użytkownik jest administratorem, brawa! */ } |
W zasadzie na tym moglibyśmy zakończyć, ale tego nie zrobię. Muszę koniecznie napisać jeszcze jedną rzecz. Tak naprawdę rzadko się zdarza, żebyśmy musieli wiedzieć, czy dany użytkownik jest administratorem. Naprawdę!
O wiele istotniejsze jest to, czy dany użytkownik może wykonać konkretną czynność.
Do tego używamy funkcji current_user_can(). To pozwala na o wiele lepszą kontrolę nad tym, co może użytkownik a co nie, zamiast na sztywno przypisywać role. Bardziej elegancko jest nadawać możliwość wykonywania czynności.
1 2 3 4 5 6 |
function myThemeCheckCurrentUser() { if ( ! current_user_can('manage_options')) { /* to może, domyślnie, administrator, więc... */ return; } } |
ale tak zrobić nie możemy. Bo, być może, jakaś wtyczka albo motyw nadał tę możliwość użytkownikowi o innym statusie niż administrator… Dlatego – sprawdzajmy, czy użytkownik może wykonać daną czynność a nie – czy jest administratorem.