Mam pytanie dotyczące „pętli”.
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
Kod pobrany ze strony Loop WordPress Codex .
Dlaczego powinienem umieścić if
część? Wygląda na to, że jeśli jest while
pętla, działa dobrze.
W jakim przypadku problem występuje, jeśli nie ma if
instrukcji?
Edytować
Zaakceptowałem odpowiedź @ Chip. ale szczerze mówiąc, potrzebuję tylko ostatniej części.
Wiem teraz, co chciałem wiedzieć z mojego pytania.
if
instrukcja jest dostępna tylko wtedy, gdy jest to konieczne, jeśli chcesz umieścić nagłówek lub stopkę, które powinny być zapisane tylko raz. jeśli nie używasz „opakowania”, wówczasif
instrukcja nie jest konieczna.
Odpowiedzi:
Program ładujący szablony WordPress w wielu okolicznościach będzie zawierać odpowiedni plik szablonu kontekstowego, nawet jeśli zapytanie dla tego kontekstu nie zwróci żadnych postów. Na przykład:
Dlatego w takich przypadkach odpowiedni plik szablonu zostanie załadowany, ale nie zostaną wydrukowane żadne posty, ponieważ zapytanie nie zwróci żadnych postów.
Przykłady weryfikacji koncepcji:
Dlatego w tych kontekstach przydatne jest, aby plik szablonu zawierał
if ( have_posts() )
warunek.W innych kontekstach plik szablonu nigdy nie zostanie załadowany, jeśli zapytanie nie zwróci żadnych postów. Na przykład:
W tych kontekstach
if ( have_posts() )
prawdopodobnie nie jest to konieczne.Edytować
Aby zrozumieć, co się dzieje, musisz spojrzeć na kolejność działań WordPress . Zaczynając od
wp_loaded
(i pomijając niektóre dla jasności):wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Co się dzieje i w jakiej kolejności?
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Tak więc,
the_post
zwolniony przezthe_post()
, dzieje się długo po przeanalizowaniu zapytania, pobraniu postów i załadowaniu szablonu.Och, ale wierzę, że dokładnie o to prosiłeś.
Prawdziwe pytanie brzmi: co to jest poprawny zwrot zapytania ? W przypadku kontekstów, takich jak indeks archiwum kategorii, zapytanie jest poprawne, a szablon kategorii jest ładowany, jeśli istnieje identyfikator kategorii, którego dotyczy zapytanie, nawet jeśli do tej kategorii nie przypisano żadnych postów .
Czemu? Ponieważ analizowane zapytanie to (IIRC)
&cat={ID}
- co jest poprawnym zapytaniem, nawet jeśli do tej kategorii nie przypisano żadnych postów , a zatem nie daje wyniku 404 podczas analizy.W takim przypadku otrzymasz prawidłowe zapytanie i załadowany plik szablonu, ale nie ma wpisów . Tak więc
if ( have_posts() )
, jest w rzeczywistości istotne. Ponownie, oto przykład: kategoria istnieje, ale nie ma przypisanych wpisów. Plik szablonu kategorii jest ładowany zif ( have_posts() )
powrotemfalse
.Nie dotyczy to zapytań zawierających zmienną wpisu (
&p={ID}
), takich jak pojedyncze posty na blogu i strony statyczne, ponieważ post faktycznie nie istnieje, a po przeanalizowaniu zapytanie nie zwróci prawidłowego obiektu.Edytuj 2
Nie. Pamiętaj: szablon jest wybierany o godzinie
template_redirect
. Jeśli więc zapytanie jest prawidłowe, ładowany jest odpowiedni plik szablonu. Jeśli zapytanie nie jest poprawne, szablon 404 jest ładowany.Tak więc po załadowaniu szablonu - np. Szablonu kategorii - po wygenerowaniu pętli szablon się nie zmienia .
Spójrz ponownie na kolejność działań:
parse_query
pre_get_posts
wp
template_redirect
- szablon jest wybierany i ładowany tutaj. Jest to szablon bez powrotu . Szablon nie może się zmienić po tym punkcie.the_post
- tutaj ustawia się postdata, jako część wywołania pętli. Nazywa się to wewnątrz szablonu , a szablon nie zmienia się w zależności od dostępnych danych w obiekcie zapytaniaOstateczna edycja
I w końcu rozumiem: przez cały czas twoje pytanie nie miało nic wspólnego z WordPress lub WordPress Loop . Pytasz o zawinięcie dowolnej dowolnej
while
pętli PHP wif
warunek, który sprawdza ten sam warunek.To pytanie jest poza zakresem WPSE, ale krótko wyjaśnię:
if
Uwarunkowane jest ocena binarna: to albotrue
albofalse
, i to, co dzieje się wewnątrz tej warunkowym jest wykonywany raz .while
Uzależnione jest pętla : pozostaje prawdziwe dla pewnego okresu dyskretnych, oparte na pewnego rodzaju przeciwjony; a to, co dzieje się wewnątrz tego warunku, jest wykonywane kilka razy - raz dla każdej iteracji licznika.Powiedzmy, że chcesz wypisać nieuporządkowaną listę rzeczy, jeśli lista rzeczy jest zapełniona. Jeśli użyjesz
while
pętli i pominieszif
opakowanie, twój znacznik wyglądałby następująco:A jeśli
list_of_things()
byłby pusty, renderowany wynik byłby:Który pozostawia niepotrzebne (i nieprawidłowe) znaczniki.
Ale jeśli dodasz
if
opakowanie warunkowe, możesz to zrobić:A jeśli
list_of_things()
byłby pusty, w ogóle nie byłyby generowane żadne znaczniki.To tylko jeden przykład. Istnieje wiele zastosowań tego
if
opakowania warunkowego, aif
opakowanie warunkowe służy do zupełnie innych celów niżwhile
pętla.źródło
the_post();
dlatego, że również niewhile
jest konieczne. +1 za kompletność informacji.if( have_posts() )
oświadczenia ma sens (właśnie tego próbuję się dowiedzieć), ale nie używaj go tylkothe_post()
na pojedynczych stronach!if( have_post() )
stan przed pełnej pętli w kontekściesingle-*.php
ipage-*.php
plików szablonu?Naprawdę niemożliwe jest poprawienie odpowiedzi Chipa, ale po prostu przejdź do sedna:
Użyj tej
if
części, jeśli chcesz, aby pojawiało się coś innego, gdy nie ma żadnych postów . Jest to szczególnie przydatne na przykład na stronie archiwum daty lub kategorii. Jeśli ktoś przejdzie do strony, na której nie ma żadnych postów, miło jest mieć taki komunikat, a nie tylko nic się nie wyświetla, ponieważ pętla nigdy nie zostanie wykonana.źródło
Mogą istnieć pewne uwagi, które nie zostały dotychczas uwzględnione w odpowiedziach. Nie zaleca się pomijania instrukcji if.
Instrukcja if jest powszechnie używana do:
no posts found
wskazania, że dana kategoria nie ma przypisanych artykułów.Co się stanie, jeśli zostanie dodany nowy hak?
Innym możliwym problemem nieużywania instrukcji if jest to, że jeśli zespół wordpress kiedykolwiek zdecyduje się dodać nowy hak, który uruchamia się przy pierwszym
$wp_query->have_posts()
wywołaniu, uruchomi się w niewłaściwym czasie. A jeśli spowoduje to nieoczekiwane zachowanie, to twoja wina będzie polegać na nieprzestrzeganiu specyfikacji.Inni deweloperzy oczekują określonej struktury dla pętli wordpress
Podejrzewam, że inni programiści oczekują całej pętli wordpress. Więc może to zły pomysł, aby szukali instrukcji if, której nie ma.
źródło
Widzę to jako podstawowe pytanie teorii struktury kontroli. Zamknięty blok w pętli while nie jest wykonywany nawet raz, jeśli warunek (have_posts ()) za pierwszym razem oceni jako fałszywy.
Tak więc celem
if ( have_posts() )
pętli WordPress jest wykonanie funkcji have_posts () tylko raz, zanim warunek while zostanie oceniony. Jeślihave_posts()
nie ma żadnych skutków ubocznych, toif ( have_posts() )
jest całkowicie bezcelowe. Jeślihave_posts()
ma skutki uboczne, możesz uprościć w następujący sposób:źródło
if
Jest tam ze względu naelse
po niej. Nie ma innego powodu. Jeśli nie ma żadnych postów, wyświetlenie miłej wiadomości „brak postów” jest lepsze niż nic.