Ich habe eine Frage zu "the loop".
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php endwhile; else: ?>
<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>
<?php endif; ?>
Code aus der Loop WordPress Codex Seite .
Warum sollte ich if
Teil setzen ? Es scheint, als ob es eine while
Schleife gibt, die gut funktioniert.
In welchem Fall tritt ein Problem auf, wenn keine if
Aussage vorliegt?
Bearbeiten
Ich habe die Antwort von @ Chip akzeptiert. aber ehrlich gesagt brauche ich nur den letzten teil.
Ich weiß jetzt, was ich von meiner Frage wissen wollte.
if
Anweisung ist nur dann erforderlich, wenn Sie eine Kopf- oder Fußzeile einfügen möchten, die nur einmal geschrieben werden soll. Wenn Sie den "Wrapper" nicht verwenden, ist dieif
Anweisung nicht erforderlich.
Antworten:
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:
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:
In diesen Zusammenhängen
if ( have_posts() )
ist das wohl unnötig.Bearbeiten
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?
parse_query
pre_get_posts
wp
template_redirect
get_header
wp_head
the_post
dynamic_sidebar
get_footer
wp_footer
Also passiert
the_post
, ausgelöst durchthe_post()
, lange nachdem die Abfrage analysiert, Beiträge abgerufen und die Vorlage geladen wurde.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 mitif ( 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
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 AbfrageobjektFinal Edit
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 eineif
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: Entwedertrue
oderfalse
, 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 denif
Wrapper weglassen , sieht Ihr Markup folgendermaßen aus:Und wenn
list_of_things()
leer wäre, wäre die gerenderte Ausgabe:Was unnötiges (und ungültiges) Markup hinterlässt.
Wenn Sie jedoch einen
if
bedingten Wrapper hinzufügen , können Sie Folgendes tun: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 derif
bedingte Wrapper erfüllt einen ganz anderen Zweck als diewhile
Schleife.quelle
the_post();
weil auch daswhile
unnötig ist. +1 für die Vollständigkeit der Informationen.if( have_posts() )
Anweisung Sinn (das versuche ich herauszufinden), aber nicht nurthe_post()
in einzelnen Seiten!if( have_post() )
Bedingung vor der vollständigen Schleife im Kontext vonsingle-*.php
undpage-*.php
Vorlagendateien zu entfernen ?Es ist wirklich unmöglich, die Antwort von Chip zu verbessern, aber nur auf den Punkt zu bringen:
Verwenden Sie den
if
Teil, wenn etwas anderes angezeigt werden soll, wenn keine Beiträge vorhanden sind . Dies ist zum Beispiel auf einer Datums- oder Kategoriearchivseite besonders nützlich. Wenn jemand zu einer Seite navigiert, die keine Beiträge enthält, ist es schön, eine Nachricht zu haben, die dies sagt, und nicht nur, dass überhaupt nichts angezeigt wird, da die Schleife nie ausgeführt wird.quelle
Es kann einige Überlegungen geben, die in den Antworten bisher nicht enthalten sind. Es wird nicht empfohlen, die if-Anweisung wegzulassen.
Die if-Anweisung wird häufig verwendet, um:
no posts found
um anzuzeigen, dass der betreffenden Kategorie keine Artikel zugeordnet sind.Was ist, wenn ein neuer Haken hinzugefügt wird?
Ein weiteres mögliches Problem, wenn die if-Anweisung nicht verwendet wird, besteht darin, dass ein neuer Hook, der beim ersten
$wp_query->have_posts()
Aufruf ausgelöst wird, zum falschen Zeitpunkt ausgelöst wird, wenn das WordPress-Team sich jemals dazu entschließt, einen neuen Hook hinzuzufügen . Und wenn dies zu unerwartetem Verhalten führt, liegt es an Ihnen, dass Sie die Spezifikation nicht ordnungsgemäß befolgen.Andere Entwickler erwarten eine bestimmte Struktur für die WordPress-Schleife
Ich nehme an, andere Entwickler erwarten die gesamte WordPress-Schleife. Vielleicht ist es eine schlechte Idee, sie nach einer if-Anweisung suchen zu lassen, die nicht vorhanden ist.
quelle
Ich sehe dies als eine grundlegende Frage der Kontrollstrukturtheorie. Der eingeschlossene Block innerhalb der while-Schleife wird nicht einmal ausgeführt, wenn condition (have_posts ()) das erste Mal als false ausgewertet wird.
Der Zweck
if ( have_posts() )
der WordPress-Schleife besteht also darin, die Funktion have_posts () nur einmal auszuführen, bevor die while-Bedingung ausgewertet wird. Wennhave_posts()
keine Nebenwirkungen hat, dannif ( have_posts() )
ist das völlig sinnlos. Wennhave_posts()
Nebenwirkungen auftreten, können Sie dies wie folgt vereinfachen:quelle
if
liegt daran daselse
danach. Kein anderer Grund. Wenn keine Beiträge vorhanden sind, ist es besser, eine nette Nachricht "Keine Beiträge" anzuzeigen, als nichts anzuzeigen.