WordPress: So machst du deine WP_Query schneller

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:

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:

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 Sekunden
  • HOUR_IN_SECONDS = 60 Minuten
  • DAY_IN_SECONDS = 24 Stunden
  • WEEK_IN_SECONDS = 7 Tage
  • MONTH_IN_SECONDS = 30 Tage
  • YEAR_IN_SECONDS = 365 Tage

Mehr zum Thema Transients findest du hier.