WordPress Transients durchsuchen und löschen wenn ein bestimmter Transient-Name zutrifft
Als Theme- und Plugin Entwickler kommt man um die Verwendung von WordPress Transients nicht herum. Denn Transients bieten die Möglichkeit, bestimmte Datenbankabfragen oder auch andere Inhalte zwischenzuspeichern bzw. zu cachen. Das wiederum bietet uns den Vorteil die Performance und somit die Ladezeit erheblich zu verbessern.
WordPress bietet von Haus aus verschiedene Funktionen um mit Transients zu arbeiten. Da haben wir z.B. set_transient() um einen Transient zu erstellen, get_transient() um den Inhalt zu erhalten oder delete_transient() um einen bestimmten Transient zu löschen. Das sieht in der Anwendung dann so aus:
Wie kann ich Transients finden die einen bestimmten Namen enthalten?
Kinderleicht ist es mit Hilfe von delete_transient() einen Transienten zu löschen, wenn wir den genauen Namen wissen. Je nach Anwendungsfall kann es jedoch vorkommen, dass Transienten dynamisch erstellt werden und der Name weitere Parameter enthält, die uns zum Zeitpunkt des Löschens nicht bekannt sind. In diesem Fall müssen wir prüfen, ob der Name eines WordPress Transienten einen bestimmten Bestandteil enthält, um ihn zu löschen.
Im ersten Schritt müssen wir zunächst alle Transienten erhalten, die WordPress abgespeichert hat. Das erreichen wir unter Verwendung eines SQL-Queries:
Damit erhalten wir nun alle Transienten, die wir für unsere Prüfung benötigen. Im nächsten Schritt listen wir dazu nur die benötigten Namen der Transienten auf, denn abgespeicherte Inhalte spielen für uns in diesem Fall keine Rolle. Das können wir folgendermaßen tun:
Nun erhalten wir durch $all_transient_keys
ein Array aller Transient-Namen, die WordPress derzeit gespeichert hat. Diese Liste von Namen können wir nun dazu nutzen, um zu prüfen ob der Name einen bestimmten Wert / Bestandteil enthält:
Im oberen Code-Schnipsel ist zu sehen, dass wir jetzt über if( strpos( $keys, 'blog_list' ) !== false )
prüfen können, ob der Transient-Name den Wert „blog_list“ enthält. Wenn das der Fall ist, dann entfernen wir mit ltrim( $keys, '_transient_' )
noch den Prefix „_transient_„, um nur den reinen Namen zu erhalten. Diesen Namen können wir jetzt dazu nutzen, um mit Hilfe der WordPress-Funktion delete_transient( $transient_name )
alle Transienten zu löschen, welche den Wert „blog_list“ im Namen enthalten.
Alle Transienten mit einem bestimmten Namen löschen, wenn man einen WordPress Beitrag speichert.
Wir wir wissen, können Transienten dazu dienen, bestimmte Datenbankabfragen zu cachen um die Ladezeit der WordPress Webseite zu verbessern. Anstatt viele kostspielige Datenbankanfragen zu generieren, werden stattdessen nur 2 Abfragen benötigt, um bspw. eine große Liste von WordPress Beiträgen zu laden.
Da der Inhalt des Transienten jedoch einen festen Wert besitzt, nämlich den Inhalt, der zum Zeitpunkt des Speicherns bestand, wird im Falle einer Beitrags-Liste immer noch der veraltete Inhalt ausgegeben, auch dann wenn er sich längst geändert hat. Zum einen können wir beim Speichern von Transienten eine Laufzeit (z.B. 24 * HOUR_IN_SECONDS
) festlegen, die besagt wie lange ein Transient existieren soll, bis er automatisch gelöscht wird, um sich beim nächsten Aufruf wieder zu erneuern.
Doch das ist nicht in jedem Fall praktikabel. Denn wenn man einen WordPress Beitrag bearbeitet, sollte dieser auch in einer Beitragsliste aktualisiert werden. In diesem Fall müssen wir eine Löschung des Transienten zum Zeitpunkt einer Beitragsaktualisierung ausführen. Dafür können wir den WordPress-Hook save_post
(?) verwenden.
Der folgende Code-Schnipsel zeigt dir, was wir tun müssen um alle existierenden Transienten, welche einen bestimmten Wert im Namen enthalten, zu löschen, sobald ein WordPress Beitrag gespeichert bzw. aktualisiert wurde: