Der WordPress-Vorlagenlader enthält in vielen Fällen die entsprechende kontextbezogene Vorlagendatei, auch wenn die Abfrage für diesen Kontext keine Beiträge zurückgibt. Beispielsweise:
- Der Haupt-Blog-Index
- Category Archive Index (Kategorie existiert, hat aber keine Beiträge)
- Tag-Archiv-Index (Tag existiert, hat aber keine Beiträge)
- Autorenarchivindex (Autor existiert, hat aber keine Beiträge)
- Suchergebnis-Index
In diesen Fällen wird die entsprechende Vorlagendatei geladen, es werden jedoch keine Beiträge ausgegeben, da die Abfrage keine Beiträge zurückgibt.
Proof-of-Concept-Beispiele:
In diesen Kontexten ist es daher nützlich, dass die Vorlagendatei die if ( have_posts() )
Bedingung enthält.
In anderen Kontexten wird die Vorlagendatei niemals geladen, wenn die Abfrage keine Beiträge zurückgibt. Beispielsweise:
- Einzelner Blog-Beitrag
- Statische Seite
In diesen Zusammenhängen if ( have_posts() )
ist das wohl unnötig.
Bearbeiten
Ich verstehe, dass die Abfrage von the_post () aufgerufen wird, richtig? Wenn while (have_posts ()) vorhanden ist, wird die Abfrage nie ausgeführt, wenn kein Beitrag vorhanden ist.
Um zu verstehen, was los ist, müssen Sie sich die Reihenfolge der WordPress-Aktionen ansehen . Beginnen Sie mit wp_loaded
(und lassen Sie einige aus Gründen der Klarheit weg):
wp_loaded
parse_request
send_headers
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
wp_footer
Also, was passiert und in welcher Reihenfolge?
- Die Abfrage wird aufgerufen:
parse_query
pre_get_posts
wp
- Die Vorlage ist ausgewählt:
- Die Vorlage wird geladen / ausgegeben. Die folgenden Aktionen werden von der Vorlage ausgelöst :
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Also passiert the_post
, ausgelöst durch the_post()
, lange nachdem die Abfrage analysiert, Beiträge abgerufen und die Vorlage geladen wurde.
Ich bin sehr dankbar, dass Sie viele Informationen geben, die ich nicht kannte, aber das habe ich nicht gefragt.
Oh, aber ich glaube, dass es genau das ist , was Sie gefragt haben.
Die eigentliche Frage lautet: Was ist eine gültige Rückfrage ? Für Kontexte wie den Kategoriearchivindex ist die Abfrage gültig, und die Kategorieschablone wird geladen, wenn die abgefragte Kategorie-ID vorhanden ist, auch wenn dieser Kategorie keine Beiträge zugewiesen sind .
Warum? Weil die zu analysierende Abfrage (IIRC) ist. Dies &cat={ID}
ist eine gültige Abfrage, auch wenn dieser Kategorie keine Posts zugewiesen sind , und führt daher beim Analysieren nicht zu 404.
In diesem Fall erhalten Sie eine gültige Abfrage und eine Vorlagendatei geladen, aber keine Beiträge . So if ( have_posts() )
, ist in der Tat relevant. Auch hier ist ein Beispiel: Kategorie existiert, aber es wurden keine Beiträge zugewiesen. Die Kategorie-Vorlagendatei wird mit if ( have_posts() )
Rückkehr geladenfalse
.
Dies gilt nicht für Abfragen, die eine Beitragsvariable ( &p={ID}
) enthalten, z. B. einzelne Blog-Beiträge und statische Seiten, da der Beitrag nicht vorhanden ist und die Abfrage beim Analysieren kein gültiges Objekt zurückgibt.
Bearbeiten 2
Wenn ich richtig verstehe, ob es kein if (have_posts ()) in einer Kategorieschablone gibt und die Kategorie keinen Beitrag hat, gibt sie 404.php zurück, obwohl es category-sample.php ohne Beitrag zurückgeben sollte. Ist das richtig?
Nein. Denken Sie daran: Die Vorlage ist unter ausgewählt template_redirect
. Wenn die Abfrage also gültig ist, wird die entsprechende Vorlagendatei geladen. Wenn die Abfrage nicht gültig ist, wird die Vorlage 404 geladen.
Sobald also eine Vorlage geladen ist - z. B. die Kategorie-Vorlage -, ändert sich die Vorlage nach der Ausgabe der Schleife nicht mehr .
Sehen Sie sich die Reihenfolge der Aktionen noch einmal an:
parse_query
pre_get_posts
wp
template_redirect
- Vorlage wird hier ausgewählt und geladen. Dies ist der Vorlagenpunkt ohne Rückgabe . Die Vorlage kann nach diesem Zeitpunkt nicht mehr geändert werden.
- ...
the_post
- hier werden im rahmen des loop-aufrufs postdaten eingerichtet. Dies wird in der Vorlage aufgerufen und die Vorlage ändert sich nicht basierend auf den verfügbaren Daten im Abfrageobjekt
Final Edit
Und ich behaupte, dass, während die Existenz von Posts überprüft wird, warum ich denselben Test zweimal ausführen sollte. Das ist meine Frage von Anfang an, die ich nur danach gestellt habe.
Und damit verstehe ich endlich: Ihre Frage hatte die ganze Zeit nichts mit WordPress oder der WordPress-Schleife zu tun . Sie möchten eine beliebige PHP- while
Schleife in eine if
Bedingung einschließen, die dieselbe Bedingung überprüft.
Diese Frage fällt nicht in den Anwendungsbereich von WPSE, aber ich werde kurz erklären:
Eine if
Bedingung ist eine binäre Auswertung: Entweder true
oder false
, und was in dieser Bedingung geschieht , wird einmal ausgeführt .
Eine while
Bedingung ist eine Schleife : Sie bleibt für einen bestimmten Zeitraum gültig, basierend auf einer Art Zähler. und was innerhalb dieser Bedingung passiert , wird mehrmals ausgeführt - einmal für jede Iteration des Zählers.
Angenommen, Sie möchten eine ungeordnete Liste mit Dingen ausgeben, wenn die Liste mit Dingen gefüllt ist. Wenn Sie eine while
Schleife verwenden und den if
Wrapper weglassen , sieht Ihr Markup folgendermaßen aus:
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
Und wenn list_of_things()
leer wäre, wäre die gerenderte Ausgabe:
<ul>
</ul>
Was unnötiges (und ungültiges) Markup hinterlässt.
Wenn Sie jedoch einen if
bedingten Wrapper hinzufügen , können Sie Folgendes tun:
<?php if ( list_of_things() ) : ?>
<ul>
<?php while ( list_of_things() ) : ?>
<li><?php the_list_item(); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
Und wenn list_of_things()
leer wäre, würde überhaupt kein Aufschlag ausgegeben.
Das ist nur ein Beispiel. Es gibt viele Verwendungszwecke für diesen if
bedingten Wrapper, und der if
bedingte Wrapper erfüllt einen ganz anderen Zweck als die while
Schleife.