wake-up-neo.net

Holen Sie sich den Post-Permalink innerhalb der Schleife, aber ohne zusätzliche DB-Abfrage

Ich möchte eine benutzerdefinierte "Verzeichnis" -Seite erstellen, die auf mehrere Tausend Beiträge verweist. Aufgrund der großen Anzahl versuche ich, die Anzahl der DB-Abfragen zu begrenzen. Ich stelle fest, dass ich get_permalink () aufrufe, um einen Link zu jedem Beitrag zu erstellen. Dadurch wird eine zusätzliche DB-Abfrage für jeden Beitrag erstellt.

Gibt es überhaupt eine Möglichkeit, den Post-Permalink ohne eine zusätzliche Abfrage abzurufen? Ich habe versucht, das $ post-Objekt zu übergeben, das nicht zu helfen scheint. Ich habe mir auch die Kernfunktion angesehen und festgestellt, dass durch Übergabe des gesamten Objekts zusammen mit einem Wert von $ post-> filter = 'sample' ein zusätzlicher Aufruf von get_post () vermieden wird, wie folgt:

Warum erzeugt get_permalink () ein Add. DB Anfrage ohne $ post-> Filter?

Aber es scheint immer noch eine zusätzliche Abfrage zu verursachen. Irgendwelche Ideen?

1
NJ.

Ich stelle fest, dass ich zum Verknüpfen mit jedem Beitrag get_permalink() aufrufe und dadurch für jeden Beitrag eine zusätzliche DB-Abfrage erstelle.

Nicht wahr. Wenn Sie den Link zu dem sehr alten trac ticket # 18822 in dem Beitrag überprüfen, auf den Sie verlinkt haben, wurde dieses Problem von @kaiser im Jahr 2011 aufgeworfen. Die Frage wurde von @scribu beantwortet

Zum Beispiel:

$posts = get_posts();
foreach ( $posts as $post )
    var_dump( get_permalink( $post->ID ) );

verursacht keine zusätzlichen Abfragen, da alle diese Beiträge zwischengespeichert werden. Sie können auch das gesamte $ post-Objekt an get_permalink übergeben, ohne dass zusätzliche Abfragen erforderlich sind, da get_post() ein Objekt akzeptiert. Tatsächlich führt get_post() nur dann eine Abfrage durch, wenn Sie ein Objekt übergeben, für das die Filtereigenschaft festgelegt wurde und die Beitrags-ID nicht bereits zwischengespeichert ist.

Wie immer gehe ich nicht auf die Theorie ein, sondern auf Fakten, und die Art und Weise, wie ich meine Fakten erhalte, ist das Testen

Stellen Sie sich mit der folgenden Abfrage auf und führen Sie sie aus. Notieren Sie sich die Uhrzeit und die DB-Aufrufe

timer_start();  
$posts = get_posts();
foreach ( $posts as $post ) {

    // REST TO COME LATER

}
echo '<p>' . get_num_queries() . ' queries in ' . timer_stop(1, 5) . ' seconds. </p>';

Bei meiner lokalen Installation erhalte ich die folgenden Ergebnisse:

20 Abfragen in 0.02539 Sekunden

( HINWEIS: Die Anzahl der Abfragen bezieht sich nicht nur auf die Abfrage, sondern auf die Gesamtanzahl der auf der Seite ausgeführten Abfragen, einschließlich Menüs, Widgets, benutzerdefinierter Abfragen, Hauptabfragen usw. Die Zeiten können bei jedem Laden der Seite variieren. )

Ändern Sie nun die Abfrage wie unten angegeben

timer_start();  
$posts = get_posts();
foreach ( $posts as $post ) {

    get_permalink( $post->ID );

}
echo '<p>' . get_num_queries() . ' queries in ' . timer_stop(1, 5) . ' seconds. </p>';

Und das ist mein Ergebnis

20 Abfragen in 0.02539 Sekunden.

Wie Sie sehen können und wie ich bewiesen habe, wird der Cache zuerst überprüft, bevor eine Abfrage durchgeführt wird, wie im Trac-Ticket beschrieben.

FAZIT

Sie können get_permalink() verwenden und müssen sich keine Gedanken über zusätzliche Datenbankaufrufe aufgrund des Cachesystems in Wordpress machen. Nehmen Sie sich auch Zeit und bearbeiten Sie das Trac-Ticket

2
Pieter Goosen