it-swarm.com.de

Soll ich loop in der single.php Datei verwenden?

Ich las viele Tutorials und überprüfte die Quellen vieler Premium/Free-Themes. Die meisten von ihnen verwenden loop in der single.php-Datei.

Die single.php-Datei zeigt nur einen Beitrag an, daher denke ich, dass the_post() ausreicht, während es unnötig ist. Gibt es einen Grund, warum diese Themen (fünfundzwanzig, zwölfundzwanzig usw.) Schleife in der single.php-Datei verwenden?

5
user1452062

Genau genommen brauchen Sie die Schleife in einzelnen Postseiten nicht, Sie brauchen nur den Aufruf von the_post().

Der Grund für the_post() ist, dass the_post() den globalen Wert $post auf das einzelne Post-Post-Objekt setzt

3
Pieter Goosen

Wenn Sie eine 100% ige Kompatibilität mit allen Plugins gewährleisten möchten, müssen Sie die Schleife auf single.php verwenden. Der Grund dafür ist, dass es loop_start- und loop_end-Aktionen gibt, die beim ersten und letzten Aufruf von have_posts() ausgelöst werden.

3
Milo

Mehr Präzision, da ich die gegebenen Antworten nicht kommentieren kann. Die Wordpress-Dokumentation ist aus Entwicklersicht nicht präzise, ​​und ich war selbst sehr verwirrt, bis ich den WP -Code öffnete.

global post

Anders als in einer bestimmten Antwort (Pieter) angegeben, wird der globale $post bereits festgelegt, wenn Sie auf einer einzelnen Vorlage landen (entweder Standardpost oder benutzerdefinierter Post). Es sollte den ersten und einzigartigen Beitrag enthalten. Ich habe es selbst versucht, den Beitrag vor und nach einer sequenziellen Schleife anzuzeigen und dann weiterzugehen, um zu sehen, was passiert.

// in single.php or single-{cpt}.php
get_the_header();
global $post;

echo "<h3>before loop</h3>";
var_dump($post);  // already contains the queried post!

echo "<h3>in loop [i=0]</h3>";
the_post();
var_dump($post); // still the same!

echo "<h3>in loop [i=1]</h3>";
the_post();
var_dump($post); // not set (NULL)

die WP Schleife

Für den Zugriff auf die Standardfelder der Posts müssen Sie also nicht unbedingt the_post() aufrufen. Wie Milo erwähnte, kann dies jedoch zu Konflikten mit Plugins führen oder zu seltsamen Verhaltensweisen, da Ihre Inhalte außerhalb der Schleife angezeigt werden. Die Aktionen loop_start und loop_end werden nicht nur übersehen, sondern die Abfrage WP enthält einen internen Status namens in_the_loop, der nicht festgelegt werden würde. Zum Beispiel würde ein Rückruf in dem Inhalt, der in_the_loop() aufruft, false erhalten, während Sie erwarten könnten, true zu erhalten, wenn Sie einen Inhalt lesen. Und das ist ziemlich irreführend, da Sie sich nicht in einer echten Schleife befinden ... Eine Schleife sollte nur für Archive gelten, die mehrere Posts enthalten, aber dies ist nur eine schlechte semantische Wahl in WP.

Sie können dies hier sehen: https://developer.wordpress.org/reference/classes/wp_query/the_post/

public function the_post() {
global $post;
$this->in_the_loop = true;

if ( $this->current_post == -1 ) // loop has just started
    /**
     * Fires once the loop is started.
     *
     * @since 2.0.0
     *
     * @param WP_Query &$this The WP_Query instance (passed by reference).
     */
    do_action_ref_array( 'loop_start', array( &$this ) );

$post = $this->next_post();
$this->setup_postdata( $post );

}

eine while-Schleife?

Die letzte Frage wäre die Notwendigkeit einer while (has_posts())-Schleife, die wenig Sinn macht, da Sie sich in einer einzelnen Beitragsvorlage befinden und ein eindeutiger Beitrag hätte gefunden werden müssen. Einige behaupten, es sei aus Konsistenzgründen so, dass es in einen allgemeinen Fall passt wie in andere Vorlagen, aber aus reiner Entwicklersicht ist es ein bisschen verwirrend. Eigentlich sollten Sie if (has_posts()) lieber im Falle eines schlechten Anrufs überprüfen, damit der Hauptgrund eher für die Robustheit liegt, falls jemals eine Umleitung fehlschlägt. Aus diesem Grund können Sie while (has_posts()) verwenden, um eine allgemeine Vorlage abzugleichen, dies ist jedoch eher eine subjektive Angelegenheit.

TL; DR

Schleifen oder nicht schleifen? Eine while-Schleife ist nicht erforderlich, aber the_post() sollte mindestens einmal aufgerufen werden, nicht zum Laden des Posts, sondern zur Übereinstimmung mit den internen Zuständen (WP_Query). Eine Prüfung mit has_posts() sollte aus Gründen der Robustheit zuvor einmal aufgerufen werden.

1
V. Högman