czwartek, 16 sierpnia 2012

WordPress: Projektowanie własnego tematu WordPress, część 2

The Loop

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