it-swarm.com.de

Wird eine über die wpdb-Klasse ausgeführte Abfrage zwischengespeichert?

Ich bin nicht sicher, wie WordPress die Abfragen zwischenspeichert. Ich hatte den Eindruck, dass eine Abfrage, die über die wpdb-Klasse ausgeführt wird, zwischengespeichert wird. Beispielsweise wird im Codex unter "Zeile auswählen" und "Var auswählen" angegeben, dass die gesamte Abfrage für die spätere Verwendung zwischengespeichert wird. Und ich denke, was bedeutet, wenn in einer anderen Abfrage weitere Daten angefordert werden, deren Teilergebnisse oder vollständige Ergebnisse sich bereits im wpdb-Cache befinden, werden diese verwendet und es findet keine Abfrage statt (im Falle vollständiger Ergebnisse, die sich bereits im Cache befinden). Habe ich recht im Verständnis?

Ich habe etwas ausprobiert und festgestellt, dass ich den Cache nicht verwenden kann. Als Referenz habe ich die jüngsten Kommentare des aktuellen Benutzers aufgelistet. Ich habe get_comments() verwendet, aber da es nur eine Post-ID in den Ergebnissen hat, habe ich get_the_title() innerhalb der Schleife zum Anzeigen dieser verwendet. Offensichtlich ist dies in Bezug auf die Abfrage teuer, so dass ich die erforderlichen Zeilen der Post-Tabelle zwischenspeichern kann, indem ich sie vorher abfrage, damit get_the_title() keine tatsächliche Abfrage ausführt. Ich habe so etwas gemacht

$query = implode( ' OR ID = ', $collect_post_ids );
$query = 'SELECT * FROM '.$wpdb->prefix.'posts WHERE ID = '.$query.';';
$wpdb->get_results( $query ); // just cache it

aber das hat nicht geholfen. get_the_title() führt noch Abfragen durch. Höchstwahrscheinlich habe ich falsch verstanden, wie WP Cache funktioniert. Wo irre ich mich?

Hier ist der vollständige Code als Referenz - http://ashfame.Pastebin.com/BpxjHiQr

6
Ashfame

Nein, so funktioniert das nicht. Das datenbankbezogene Caching ist minimal und deckt meistens genau die gleichen Abfragen beim Laden einer Seite ab.

Die beste Methode zum dauerhaften Zwischenspeichern von datenbank- und/oder rechenintensiven Ergebnissen ist die Verwendung von Transients API zum Speichern von Ergebnissen für einen geeigneten Zeitraum.

6
Rarst

Die Dokumentation schlug vor, dass die Ausgabe einer Abfrage nur für diese bestimmte Anforderung zwischengespeichert wurde. Vermutlich führt WordPress daher eine gepufferte Abfrage unter MySQL durch.

In meinem Fall habe ich die Funktionen wp_cache_ * verwendet - siehe http://codex.wordpress.org/Class_Reference/WP_Object_Cache

Beispielcode:

sql = "
    SELECT {$wpdb->posts}.* FROM {$wpdb->posts}
    LEFT JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)
    LEFT JOIN {$wpdb->term_taxonomy} ON ({$wpdb->term_relationships}.term_taxonomy_id = {$wpdb->term_taxonomy}.term_taxonomy_id)
    WHERE ({$wpdb->term_taxonomy}.taxonomy = 'category' AND {$wpdb->term_taxonomy}.term_id = 9849 )
    AND
    {$wpdb->posts}.post_status = 'publish' AND
    {$wpdb->posts}.post_type = 'post' ORDER BY {$wpdb->posts}.post_title ASC";

$posts = wp_cache_get(md5($sql), 'somerandomkey');
if($posts === false) {
    $posts = $wpdb->get_results($sql, OBJECT);
    wp_cache_add(md5($sql), $posts, 'somerandomkey');
}

if(empty($posts)) {
    echo "<p>No results found </p>";
}
3
David Goodwin

Die Lösung, die @GingerDog gab, funktioniert einwandfrei, jedoch nur innerhalb einer einzelnen Seitenaktualisierung. Wenn Sie Ihr Abfrageergebnis für eine Sitzung zwischenspeichern möchten, können Sie eine ähnliche Lösung mit $ _SESSION verwenden (während die Transients-API zwischen Sitzungen und Computern funktioniert).

$sQuery = "SELECT `ID`,`post_name` FROM `wp_posts` WHERE `post_type` = 'attachment' AND `post_name` LIKE 'foobar%'";
$sQueryMD5 = md5($sQuery);
if (isset($_SESSION[$sQueryMD5])){
    $aResult = $_SESSION[$sQueryMD5];
} else { // search wp_posts
    $aResult = $wpdb->get_results($sQuery, OBJECT);
    $_SESSION[$sQueryMD5] = $aResult;
}
0
Sjeiti