Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem
WebHelp.pl Warsztat Artykuły WordPress: znaczniki warunkowe

Warsztat / Artykuły i tutoriale

WordPress: znaczniki warunkowe

Bartosz Romanowski 29 stycznia 2012 komentarze ()

Tagi:PHP WordPress

WordPress oferuje twórcom szablonów znaczniki warunkowe (conditional tags), które umożliwiają zmianę sposobu prezentacji treści w zależności od spełnionych przez daną stronę warunków. Postaram się przybliżyć ich możliwości, bo bez nich właściwie nie ma mowy o tworzeniu własnych szablonów (a i dla twórców wtyczek mogą się okazać przydatne).

Znaczniki warunkowe to po prostu funkcje zwracające true lub false. Można dzięki nim sprawdzić jaka strona jest aktualnie wyświetlana (strona wpisu, archiwum, strona błędu 404, wyniki wyszukiwania itp.) oraz dowiedzieć się nieco więcej o jej zawartości (czy aktualny wpis jest przyklejony, czy posiada wypis, jakiego jest typu itp.). Większość tych informacji można uzyskać analizując samodzielnie zwracane przez WordPressa dane o stronie lub wpisie, ale korzystanie ze znaczników warunkowych jest znacznie wygodniejsze (i zalecane).

Przykładowe wykorzystanie znacznika warunkowego może wyglądać tak:

Kod: Zaznacz cały
if(is_home()) {
    echo 'Jesteś na stronie głównej';
}
else {
    echo 'Nie jesteś na stronie głównej';
}

W ramach wstępu należy wspomnieć, że znaczniki warunkowe nie działają (poza nielicznymi wyjątkami) przed wywołaniem akcji init, tak więc nie można z nich korzystać na przykład bezpośrednio w pliku functions.php – trzeba je wywoływać w funkcji podpiętej pod tę akcję, na przykład tak:

Kod: Zaznacz cały
add_action('wp', 'czy_jestem_na_stronie_glownej');
function czy_jestem_na_stronie_glownej() {
    if(is_home()) {
        echo 'Tak, jestem na stronie głównej';
    }
    else {
        echo 'Niestety, nie jestem na stronie głównej';
    }
}

Strona główna

Do sprawdzania czy znajdujemy się aktualnie na stronie głównej służą dwa znaczniki: is_home() i is_front_page(). Pierwszy z nich mówi nam czy znajdujemy się na stronie głównej bloga (strona z wpisami), drugi natomiast określa czy znajdujemy się na stronie głównej naszego serwisu (która wcale nie musi być stroną z wpisami z bloga). Aby zobaczyć różnicę między nimi wystarczy ustawić statyczną stronę główną – Ustawienia –> Czytanie –> Strona główna wyświetla –> Statyczną stronę.

Kod: Zaznacz cały
if(is_home()) {
    echo 'Jesteś na stronie głównej bloga';
}
if(is_front_page()) {
    echo 'Jesteś na stronie głównej serwisu';
}

Panel administracyjny

Bardzo często zachodzi konieczność wykonania pewnych czynności (na przykład załadowania jakichś skryptów czy arkuszy stylów) tylko dla panelu administracyjnego WordPressa. Niezbędny okaże się tutaj znacznik is_admin(), którego w praktyce nie wykorzystuje się zwykle bezpośrednio w szablonach. Znacznika tego można (a raczej da się, co nie oznacza, że jest to zalecane) używać bezpośrednio w pliku functions.php.

Kod: Zaznacz cały
if(is_admin()) {
    echo 'Jesteś w panelu administracyjnym';
}

Wpisy i strony

Jednymi z najczęściej wykorzystywanych znaczników warunkowych są te dotyczące pojedynczych wpisów lub stron. Dzięki nim możemy zmienić sposób prezentacji treści wpisów spełniających określone warunki.

Znacznik is_single() pozwala nam na sprawdzenie czy wyświetlany jest pojedynczy post (dotyczy to również własnych typów postów). Jeśli użyjemy go bez żadnych parametrów, przyjmie wartość true dla dowolnego posta. Możemy również sprawdzić czy wyświetlany jest jakiś konkretny wpis lub grupa wpisów. is_single(15) zwróci true gdy wyświetlany jest wpis o identyfikatorze 15, is_single('nasz-nowy-wpis') gdy wyświetlany jest wpis o slugu ‘nasz-nowy-wpis’, a is_single('Tytuł wpisu') gdy wyświetlany jest wpis o tytule ‘Tytuł wpisu’. Warunki można grupować podając jako parametr tablicę (array):

Kod: Zaznacz cały
is_single(array(15, 19, 21, 23));
is_single(array('slug-wpisu', 'drugi-slug-wpisu'));
is_single(array('Tytuł wpisu 1', 'Tytuł wpisu 2'));

Można również tworzyć warunki zawierające różne rodzaje kryteriów:

Kod: Zaznacz cały
is_single(array(15, 20, 'nowy-slug', 'Jakiś tytuł'));

Trzeba pamiętać, że funkcja nie rozróżnia kryteriów, co oznacza, że jeśli mamy jeden wpis o identyfikatorze 15 oraz inny wpis o slugu ‘15’, to funkcja zwróci true dla obu z nich.

Funkcja is_page() działa w analogiczny sposób, tyle że dla stron. Przyjmuje również dokładnie takie same parametry.

Osobom z chociażby niewielkim doświadczeniem w tworzeniu szablonów dla WordPressa na pewno brakuje znacznika pozwalającego na sprawdzenie czy bieżąca strona jest podstroną (czyli czy ma jakąś stronę nadrzędną). Niestety, nie ma takiej funkcji, a jej brak zauważają nawet twórcy dokumentacji, którzy stworzyli prosty substytut (należy dodać poniższy kod do pliku functions.php)

Kod: Zaznacz cały
function is_subpage() {
    global $post;
    if(is_page() && $post->post_parent) {
        return $post->post_parent;
    } else {
        return false;
    }
}

Jeśli chcesz dowiedzieć się jak wyświetlić hierarchię stron, zajrzyj do naszego działu Porady.

Funkcja is_attachment() zwraca true jeśli wyświetlana jest strona załącznika lub obrazka. Funkcja ta nie przyjmuje żadnych parametrów.

Znacznik is_singular() stanowi swojego rodzaju połączenie trzech opisanych wyżej funkcji. Zwraca true gdy wyświetlany jest pojedynczy wpis, strona lub załącznik. Jako parametr można podać typ wpisu (również w postaci tablicy array), nie można natomiast posłużyć się identyfikatorami, tytułami lub slugami.

Czasem zachodzi potrzeba sprawdzenia jaki szablon został użyty do wygenerowania wyświetlanej strony. Z pomocą przychodzi funkcja is_page_template(). Jako parametr przyjmuje ona nazwę pliku szablonu, na przykład:

Kod: Zaznacz cały
if(is_page_template('about.php')) {
    echo 'Jesteś na stronie O Nas';
}

Jeśli funkcja zostanie wywołana bez parametru, zwróci true gdy użyty został dowolny szablon strony (czyli zwróci false na przykład na stronie archiwum albo na stronie głównej bloga, dla której użyto domyślnego szablonu).

Znaczniki is_page() i is_page_template() nie działają w pętli (The Loop) i powinny być wywoływane przed nią. Jeśli chcesz użyć ich za pętlą musisz najpierw skorzystać z funkcji wp_reset_query().

Do modyfikowania sposobu wyświetlania wpisów spełniających określone warunki mogą nam posłużyć znaczniki is_sticky(), has_excerpt, has_post_thumbnail(), has_category, has_tag() i has_term().

Funkcja is_sticky() mówi nam czy dany wpis jest przyklejony. Dzięki niemu możemy sformatować przyklejone posty w inny, odróżniający się od pozostałych wpisów sposób. Opcjonalnie możemy przekazać w parametrze identyfikator wpisu.

has_excerpt() mówi nam czy dany wpis posiada wypis (excerpt). Domyślnie funkcja zwraca nam informację o bieżącym wpisie, ale możemy przekazać jej w parametrze identyfikator konkretnego wpisu. Zamiast używać tego znacznika możemy po prostu sprawdzić atrybut post_excerpt obiektu $post:

Kod: Zaznacz cały
if(has_excerpt()) {
    echo 'To jest tylko wypis - ciąg dalszy w rozwinięciu';
}

if(!empty($post->post_excerpt)) {
    echo 'To jest tylko wypis - ciąg dalszy w rozwinięciu';
}

has_post_thumbnail() mówi nam czy dany post posiada ikonę (thumbnail). To bardzo przydatny znacznik, dzięki któremu możemy odpowiednio sformatować wpis lub dodać domyślną ikonę dla postów które jej nie posiadają.

Kod: Zaznacz cały
if(has_post_thumbnail()) {
    the_post_thumbnail();
}
else {
    echo '<img src="'.get_bloginfo('template_url').'/images/default.png" />';
}

Funkcje has_category, has_tag() i has_term() pozwalają nam na sprawdzenie do jakich taksonomii (w szczególności kategorii i tagów) jest przypisany dany wpis. Dzięki tym znacznikom możemy w prosty sposób zmienić na przykład sposób wyświetlania postów przypisanych do jakiejś kategorii. Opis tych funkcji zacznę od końca, czyli od has_term(), ponieważ dwie pozostałe są czymś w rodzaju jej aliasów. Funkcja ta służy do sprawdzenia czy wpis jest przypisany do jakiejś taksonomii (lub kilku z nich). Ponieważ zarówno kategorie jak i tagi są taksonomiami, można “zmusić” tą funkcję do działania w taki sposób jak funkcje has_category i has_tag(). Jako pierwszy parametr funkcja przyjmuje identyfikator taksonomii, jej slug lub nazwę; można również przekazać tablicę (array) wartości. Składnia jest analogiczna do znanej nam już z funkcji is_single. Drugim parametrem jest nazwa taksonomii (nadana podczas jej definiowania przy użyciu funkcji register_taxonomy()), a trzecim identyfikator wpisu (domyślnie jest to wpis bieżący).

Kod: Zaznacz cały
has_term(15, 'nasza-taksonomia');
has_term('slug-taksonomii', 'nasza-taksonomia');
has_term(array(15, 'Nazwa wartości'), 'nasza-taksonomia');

Ponieważ kategorie i tagi są wbudowanymi taksonomiami WordPressa, możemy również je sprawdzić funkcją has_term():

Kod: Zaznacz cały
// sprawdzenie czy wpis należy do kategorii o ID = 20
has_term(20, 'category');

// sprawdzenie czy wpis otagowano tagiem o nazwie 'Newsy'
has_term('Newsy', 'post_tag');

Takie samo sprawdzenie można wykonać korzystając z funkcji has_category() i has_tag():

Kod: Zaznacz cały
// sprawdzenie czy wpis należy do kategorii o ID = 20
has_category(20);

// sprawdzenie czy wpis otagowano tagiem o nazwie 'Newsy'
has_tag('Newsy');

Jeśli wywołamy którąkolwiek z tych funkcji bez podawania pierwszego parametru, zwrócone zostanie true jeśli wpis jest przypisany do jakiejkolwiek z poszukiwanych taksonomii (na przykład has_tag() zwróci true jeśli wpis jest przypisany do co najmniej jednego tagu).

Archiwa

Archiwa to strony zawierające listę wpisów z konkretnego roku, miesiąca lub dnia, a także przypisane do konkretnej taksonomii (w szczególności kategorii lub tagu) lub utworzone przez określonego autora.

Najbardziej ogólnym ze znaczników archiwów jest funkcja is_archive(). Zwraca ona true jeśli wyświetlane jest jakiekolwiek archiwum.

Funkcja is_category() zwraca true gdy wyświetlane jest archiwum kategorii. Jako parametr można jej przekazać identyfikator kategorii, jej slug lub nazwę; można również przekazać tablicę (array) tych wartości (analogicznie do opisanej wcześniej funkcji is_single()).

Funkcja is_tag() zwraca true gdy wyświetlane jest archiwum tagu. Jako parametr można jej przekazać slug tagu, również w formie tablicy (array). Co ciekawe, funkcja ta nie przyjmuje identyfikatorów ani nazw tagów.

Funkcja is_tax() zwraca true gdy wyświetlane jest archiwum taksonomii. Może przyjmować dwa parametry: nazwę taksonomii oraz jej wartość. Działa to w następujący sposób:

Kod: Zaznacz cały
// zwraca 'true' gdy wyświetlane jest archiwum dowolnej taksonomii
is_tax();

// zwraca 'true' gdy wyświetlane jest dowolne archiwum taksonomii 'gry'
is_tax('gry');

// zwraca 'true' gdy wyświetlane jest archiwum gry 'Halo 3'
is_tax('gry', 'Halo 3');

Inaczej niż w przypadku funkcji has_term(), funkcja is_tax() nie działa dla kategorii i tagów.

Funkcja is_author() zwraca true gdy wyświetlane jest archiwum autora. Jako parametr można jej przekazać identyfikator, slug lub nazwę autora, również w formie tablicy (array).

Funkcja is_date() zwraca true gdy wyświetlane jest dowolne archiwum oparte na dacie lub czasie publikacji wpisów. Informacje na temat rodzaju wyświetlanego archiwum otrzymamy dzięki funkcjom is_year() (archiwum roczne), is_month() (archiwum miesięczne), is_day() (archiwum dzienne) oraz is_time() (archiwum według czasu). Korzystając z tych funkcji możemy na przykład stworzyć nagłówek archiwum:

Kod: Zaznacz cały
if(have_posts()) {
    if(is_day()) {
        echo 'Archiwum wpisów z dnia '.get_the_date();
    }
    elseif(is_month()) {
        echo 'Archiwum wpisów z miesiąca '.get_the_date('F Y');
    }
    elseif(is_year()) {
        echo 'Archiwum wpisów z roku '.get_the_date('Y');
    }
}

Wyszukiwarka, 404 i inne

WordPress posiada również znaczniki, które mówią nam jaką funkcję pełni bieżąca strona lub w jakim trybie jest wyświetlana. is_search() mówi nam czy aktualna strona jest stroną z wynikami wyszukiwania. is_404() zwraca true gdy aktualna strona jest stroną błędu 404 (nie znaleziono strony). is_user_logged_in() mówi nam czy użytkownik przeglądający stronę jest zalogowany. is_preview() pozwala na sprawdzenie, czy aktualna strona jest wyświetlana w trybie podglądu. is_feed() zwraca true jeśli żądana strona jest kanałem RSS lub ATOM. Zwykle znacznik ten nie jest używany w szablonach – jest przydatny raczej twórcom wtyczek.

Znaczników warunkowych jest jak widać sporo i do większości zastosowań znajdziemy gotową funkcję. Warto zapoznać się z nimi, gdyż mogą nam oszczędzić wiele czasu podczas tworzenia własnego szablonu.

Więcej informacji na temat znaczników warunkowych można znaleźć w oficjalnej dokumentacji WordPressa.

Masz pytania lub wątpliwości? Odwiedź nasze forum dyskusyjne.

Bartosz Romanowski

Programista, gadżeciarz, krytyczny miłośnik produktów Apple, fan ciężkich brzmień i niepoprawny pesymista.


Komentarze


HTML CSS JavaScript PHP bazy danych MySQL Flash grafika framework hosting domeny pozycjonowanie wordpress Facebook