Pętla jest najciekawszym elementem konstrukcyjnym WordPress. Wszystko zaczyna się w niej od zapytania (które określa, które wiadomości lub strony należy pobrać), a kończy się instrukcją PHP "endwhile". To co pomiędzy nimi zależy od Ciebie. Samodzielnie możesz określić sposób i zakres wyświetlanych informacji, metadanych, pól niestandardowych itp. Można ustawić wiele pętli i zapytań na jednej stronie, na przykład w single.php można mieć jedną pętlę generującą całą zawartość jednego postu a w kolejnej pętli wyszukiwać i wpisywać tytuły i miniatury pokrewnych postów.
Zgodnie z dokumentacją Pętla musi być umieszczona w index.php i każdym innym szablonie wykorzystywanym do prezentowania postów (artykułów).
Pętla powinna zaczynać się tak:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>na koniec zaś mamy:
<?php endwhile; else: ?> <p><?php _e('Przepraszamy !!! Brak jest danych spełniających kryteria wyszukiwania.'); ?></p> <?php endif; ?>
Wewnątrz pętli można używać predefiniowanych funkcji zwanych w WordPress Template Tag'ami. Oto niektóre z nich:
- the_title - zwraca tytuł postu
- the_excerpt - zwraca fragment artykułu
- the_content - zwraca pełną zawartość posta
- the_category - zwraca kategorie posta
- the_author - zwraca autora
- the_date - zwraca datę wiadomosci
- inne znaczniki (jest wiele innych tagów które można użyć w pętli)
Kwerenda
Jak wspomnieliśmy pętla zaczyna się zapytaniem. Pierszą rzeczą jaka rzuca się w oczy jest jednak brak jakiejkolwiek jawnej instrukcji kwerendę wywołującej. O ile łatwo się domyślić, że kwerenda wykonywana jest niejawnie a jej odpalenie załatwia za nas silnik WordPressa, o tyle trudniej się domyslić skąd WordPress "wie" jakie zapytanie ma wykonać. Odpowiedź jest bardzo prosta, zapytanie wykonuje się "niejawnie" na podstawie parametrów przekazywanych w HTTP request. Kwerenda sql budowana jest ogólnie mówiąc na bazie informacji o rodzaju strony (właściwie rodzaju szablonu strony), informacji o kategorii lub identyfikatorze posta.
Co jednak, jeśli zdecydujemy się wymusić "ręcznie" wykonanie innego niż domyślne zapytania? Możemy użyć w tym celu funkcji:
query_posts()
Należy przy tym pamiętać, że metoda ta nie jest zalecana i powinniśmy korzystać z niej w ostateczności. Jeśli użyjesz query_posts() w swoim kodzie to wywołasz tym samym drugie zapytanie na bazie danych, ponieważ tak czy inaczej przy wywołaniu szablonu WordPress automatycznie wykona najpierw domyślną kwerendę. Trzeba też pamiętać o wywołaniu:
wp_reset_query()
po tym gdy zakończymy wykorzystywanie query_posts() w naszym kodzie.
Preferowanym acz nieco trudniejszym rozwiązaniem pozwalającym na wykonanie kastomowego zapytania w miejsce kwerendy domyślnej jest na przykład zmodyfikowanie zawartości requestu przy wykorzystaniu odpowiedniego filtru, wykorzystanie funkcji parse_query() lub pre_get_posts().
Pełną dokumentację powyższych funkcji znajdziecie tutaj: http://codex.wordpress.org/Template_Tags/query_posts
Wielokrotne zapytania na stronie
Często przydatna jest możliwość wykonania na jednej stronie wielu osobnych zapytań. Jeśli dla przykładu potrzebujemy wyświetlić obok treści posta linki do postów o podobnej tematyce - musimy wykonać większą liczbę na jednej stronie.
Zanim wykonamy większą liczbę zapytań musimy wiedzieć, że cytowane wyżej funkcje have_posts() i the_post() są po prostu wrapperami dla odpowiednich metod obiektu $wp_query. I tu pojawia się problem. Otóż na stronie mamy tylko jedna instancję domyślnego obiektu $wp_query.
Aby mimo togo ograniczenia wykonać wiele kwerend musimy przed wykonaniem kolejnego zapytania "obrobić" wyniki poprzedniego, a następnie wywołać rewind_posts() w celu zresetowania licznika pętli a następnie query_posts() w celu wykonania nowego zapytania.
Jeśli natomiast oryginalny obiekt zawierający wyniki zapytania jest nam niezbędny, to jedynym wyjściem pozostaje stworzenie nowego obiektu WP_Query. Odpowiedni kod mógłby wyglądać tak:
<?php $custom_query = new WP_Query('category_name=my_category&posts_per_page=20'); while ($custom_query->have_posts()) : $custom_query->the_post(); ?> <!-- Tutaj umieszczamy kod generujący kod HTML dla elementu pobranego z pętli... --> endwhile; ?>
Oryginalna treść artykułu
Ciąg dalszy cyklu ...
Brak komentarzy:
Prześlij komentarz