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:
- Indeks głównych postów na blogu
- Indeks archiwum kategorii (kategoria istnieje, ale nie ma wpisów)
- Tag Archive Index (Tag istnieje, ale nie ma postów)
- Indeks archiwum autorów (autor istnieje, ale nie ma postów)
- Indeks wyników wyszukiwania
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:
- Pojedynczy post na blogu
- Strona statyczna
W tych kontekstach if ( have_posts() )
prawdopodobnie nie jest to konieczne.
Edytować
Rozumiem, że zapytanie jest wywoływane przez the_post (), prawda? A jeśli while (have_posts ()) istnieje, zapytanie nigdy nie występuje, jeśli nie ma posta.
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?
- Wywoływane jest zapytanie:
parse_query
pre_get_posts
wp
- Szablon jest wybrany:
- Szablon jest ładowany / wysyłany. Szablon uruchamia następujące działania :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Tak więc, the_post
zwolniony przez the_post()
, dzieje się długo po przeanalizowaniu zapytania, pobraniu postów i załadowaniu szablonu.
Jestem bardzo wdzięczny za przekazanie wielu informacji, których nie znałem, ale nie o to prosiłem.
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 z if ( 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
Jeśli słusznie rozumiem, czy w szablonie kategorii nie ma opcji if (have_posts ()), a kategoria nie ma postu, wówczas zwraca 404.php, nawet jeśli powinien to być zwrot kategorii-sample.php bez postu. Czy to prawda?
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 zapytania
Ostateczna edycja
I twierdzę, że chociaż sprawdzam istnienie postów, dlaczego powinienem dwukrotnie uruchomić ten sam test. To jest moje pytanie od pierwszego pytania, które tylko o to pytałem.
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 w if
warunek, który sprawdza ten sam warunek.
To pytanie jest poza zakresem WPSE, ale krótko wyjaśnię:
if
Uwarunkowane jest ocena binarna: to albo true
albo false
, 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 pominiesz if
opakowanie, twój znacznik wyglądałby następująco:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
A jeśli list_of_things()
byłby pusty, renderowany wynik byłby:
<ul>
</ul>
Który pozostawia niepotrzebne (i nieprawidłowe) znaczniki.
Ale jeśli dodasz if
opakowanie warunkowe, możesz to zrobić:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
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, a if
opakowanie warunkowe służy do zupełnie innych celów niż while
pętla.