Ich habe vor einiger Zeit einen Beitrag dazu geschrieben bzw. dieses Thema mit in einen anderen Beitrag geschoben. Für mich ist das hier aber ein wichtiges Thema, weshalb ich dafür diesen Beitrag schreibe. Hier erfährst du ein paar Möglichkeiten, deine WP_Query
schneller zu machen und zu optimieren.
Fangen wir mit einer Frage an:
Brauchst du mehr, als Post-IDs?
Häufig benötigen wir lediglich nur die IDs der einzelnen Beiträge aus unserem WP_Query, weshalb wir die Ausgabe bereits eingrenzen können. Dafür hat WordPress bereits eine Möglichkeit geschaffen: Das fields
Argument.
Hier ein Beispiel:
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new \WP_Query($args);
if ($query->posts) {
// array mit den einzelnen IDs
print_r($query->posts);
}
Code-Sprache: PHP (php)
Mehr zu den Return-Paramatern für deine WP_Query
:
- WP_Query #Return Fields Parameter – WordPress.org
Brauchst du die Information, wie viele Posts gefunden wurden?
Wir können mit PHP schnell prüfen, ob etwas existiert oder leer ist. Das funktioniert auch mit $query->posts
aus dem obigen Beispiel. Wofür also, brauchen wir die Anzahl der Einträge, die uns WP_Query
mitliefert? Das Zählen der Einträge, ist noch ein zusätzlich Query, den wir uns sparen können.
Beispiel:
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
];
$query = new \WP_Query($args);
if ($query->posts) {
// array mit den einzelnen IDs
print_r($query->posts);
}
Code-Sprache: PHP (php)
Hierzu gibt es keinen Codex-Eintrag, diese Option wird aber in der wp-includes/class-wp-query.php
direkt in der Source auf WordPress.org gezeigt:
- WP_Query #Source – WordPress.org
Brauchst du die Informationen immer aktuell, oder reicht es vielleicht einmal am Tag?
Manchmal benötigt man die Informationen gar nicht jedes Mal, top aktuell. Innerhalb von WordPress gibt es daher die so genannten Transienten. Diese können wir verwenden um unsere Ergebnisse einmal in der Datenbank abzuspeichern. Danach wird nur noch das Ergebnis abgerufen und nicht jedes Mal ein vollständiger Query ausgeführt.
Ohne die Transients, werden jedes Mal mehrere Query ausgeführt (bis zu 5 Stück, ohne no_found_rows
im obigen Beispiel). Hier also eine Beispiel, wie du deine Ausgabe in Transienten zwischenspeichern kannst:
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
];
$transient_name = 'mein_query/' . md5(maybe_serialize($args));
$query = get_transient($transient);
if (false === $query) {
$query = new \WP_Query($args);
set_transient($transient_name, maybe_serialize($query), DAY_IN_SECONDS);
}
$query = maybe_unserialize($query);
if ($query->posts) {
print_r($query->posts);
}
Code-Sprache: PHP (php)
Hier wird jetzt der gesamte Query in einem Transient mit set_transient()
gespeichert und du kannst ihn jederzeit abrufen mit get_transient()
. Die Konstante DAY_IN_SECONDS
gibt an, dass der Transient für einen gespeichert werden soll.
Du kannst die folgenden Konstanten verwenden:
MINUTE_IN_SECONDS
= 60 SekundenHOUR_IN_SECONDS
= 60 MinutenDAY_IN_SECONDS
= 24 StundenWEEK_IN_SECONDS
= 7 TageMONTH_IN_SECONDS
= 30 TageYEAR_IN_SECONDS
= 365 Tage
Mehr zum Thema Transients findest du hier.