WordPress Speed Optimierung – Performanceprobleme identifizieren und beheben
WordPress ist dafür bekannt, dass es in Bezug auf Geschwindigkeit und Leistung nicht immer die ideale Wahl ist. Im nachfolgenden Beitrag erklären wir, weshalb diese Pauschalaussage differenziert getätigt werden sollte und präsentieren passende Taktiken, um den Speed von WordPress zu optimieren.
WordPress Speed Optimierung - Performanceprobleme identifizieren und beheben, WordCamp Switzerland 2023 in Murten
SPEED MATTERS – Deshalb ist Speed ein wichtiger Faktor für den Erfolg von Webseiten
Besseres Suchmaschinenranking
Google bevorzugt Websites, welche schnell geladen werden. Insbesondere der (LCP, Largest Contentful Paint) wird als Indikator verwendet. Der LCP gibt an, wie schnell das grösste sichtbare Element auf einer Seite geladen wird (z. B. ein Bild oder ein Slider). Eine schnelle Ladezeit des LCP trägt dazu bei, dass die Nutzererfahrung verbessert wird, was zu einer höheren Nutzerzufriedenheit und einem besseren Ranking in den Google-Suchergebnissen führen kann.
Längere Verweildauer
Besucher verweilen tendenziell länger auf Websites, welche schnell geladen werden. Wenn eine Website schnell lädt, erhöht sich die Wahrscheinlichkeit, dass Besucher auf der Seite bleiben und mehr Seiten aufrufen. Langsame Ladezeiten können hingegen dazu führen, dass Besucher ungeduldig werden und die Seite verlassen, bevor sie sich mit dem Inhalt beschäftigen können.
Mehr Verkaufsabschlüsse
Kunden bevorzugen Onlineshops, welche schnell geladen werden. Wenn die Ladezeit zu lange dauert, kann das den potenziellen Käufer frustrieren und dazu führen, dass er die Webseite verlässt und zur Konkurrenz wechselt. Eine schnelle Ladezeit kann hingegen das Vertrauen in den Onlineshop erhöhen und zu einer positiven Kundenbindung führen.
Warum ist meine WordPress Website so langsam?
Einige Webentwickler erzählen immer wieder die gleiche Geschichte, dass WordPress langsam ist und deshalb für grosse Projekte nicht geeignet sei. Was an dieser Geschichte ist wahr? Ist WordPress tatsächlich langsamer als andere Systeme?
Um die Frage «ob WordPress langsam ist» beantworten zu können, muss man das System und seine innere Funktionsweise im Detail kennen. Als führende WordPress Experten aus der Schweiz kennen wir die internen Abläufe und Strukturen von WordPress sehr genau und können es deshalb wagen, eine Antwort auf diese vielschichtige Frage zu geben.
WordPress kann in seiner Grundinstallation als sehr performant angesehen werden. Installiert man WordPress neu und verwendet ein Standard Theme, läuft die Auslieferung der Inhalte blitz-schnell und die Performance ist allgemein sehr gut.
WordPress hat seinen ausgezeichneten Ruf nicht wegen seines Speeds, sondern wegen der Umstände, dass es sehr vielseitig und flexibel erweiterbar ist. Dieser Umstand ist bei der Entwicklung neuer Projekte sehr praktisch, so kann mit WordPress fast jede Anforderung ohne Programmierkenntnisse umgesetzt werden. Jedoch ist die Flexibilität von WordPress oft auch genau die Ursache für Performanceprobleme, weil die einzelnen Plugins zwar meist untereinander kompatibel sind, jedoch nicht hinsichtlich der Performance aufeinander abgestimmt sind. Dies bedeutet in der Praxis, dass verschiedene Plugins teilweise die gleichen Daten aus der Datenbank laden und verarbeiten, weil die einzelnen Plugins keine Kenntnisse von der inneren Funktionsweise voneinander haben. Das führt dazu, dass gewisse Prozesse mehrfach durchlaufen werden, obwohl dies nicht nötig wäre. Im Extremfall kann es sogar dazu führen, dass ein Plugin während der Programmverarbeitung spezifische Veränderungen an den verarbeiteten Daten vornimmt, welche ein anderes Plugin zu einem späteren Zeitpunkt während des selben Programmverarbeitungsprozesses wieder rückgängig macht.
WordPress wird mit jedem Plugin langsamer, weshalb der Grundsatz gilt: Je weniger Plugins, desto schneller die Auslieferung der eigenen Website.
WordPress verstehen – Plugins, Hooks & Filter
Um mögliche Probleme mit dem Speed der eigenen Website korrekt identifizieren zu können, ist es wichtig, dass man die innere Funktionsweise von WordPress zumindest ansatzweise versteht. Wer die technische Verarbeitung innerhalb des WordPress Core versteht, findet zuverlässig geeignete Ansatzpunkte für die Performanceoptimierung, für alle Anderen bleibt nur Try & Error.
WordPress arbeitet mit sogenannten Hooks & Filtern. Diese zwei Techniken der Programmierung ermöglichen es Entwicklern von Plugins und Themes, während der Laufzeit auf Daten & Eigenschaften von WordPress zuzugreifen, diese zu beeinflussen und zu verändern.
Damit der Redakteur beispielsweise bequem eine Bildergalerie im Backend erstellen kann, installiert dieser wahrscheinlich ein zusätzliches Plugin, welches genau diese Funktion zur Verfügung stellt. Damit der Redakteur nach der Installation des passenden Plugins tatsächlich auch eine Bildergalerie erstellen kann und diese danach den Besuchern der Website auch ausgegeben wird, müssen sowohl im Frontend wie auch im Backend zusätzliche Programmfunktionen bereitgestellt werden. Damit das Plugin diese Programmfunktionen hinzufügen kann, stellt der WordPress Core unzählige kleine Programmierschnittstellen in Form von Hooks & Filtern zur Verfügung. Über diese Schnittstellen können Plugins zusätzlichen Code im WordPress Core registrieren. Dieser zusätzliche Code greift oft mitten in den Verarbeitungsprozess von Informationen ein, was eine Manipulation der zu verarbeitenden Informationen zur Laufzeit ermöglicht.
Je mehr Hooks und Filter in einem Content Management System vorhanden sind (und bei WordPress sind das sehr viele), desto flexibler ist das System und desto einfacher kann die Funktionalität des System mittels Plugins erweitert werden.
Die Vor- und Nachteile von Hooks liegen auf der Hand. Dank der vielen Hooks, welche der WordPress Core bereitstellt, können zu WordPress alle denkbaren Features & Funktionen hinzugefügt werden. Diese Flexibilität erkauft sich WordPress auf Kosten von Rechenleistung, denn jeder Hook bedeutet zusätzliche Programmschleifen, was die Ausführungszeit negativ beeinflusst.
WordPress Ladezeiten richtig messen – PageSpeed Insights
Webentwickler erleben häufig Beschwerden von Kunden oder Benutzern, die sich über die vermeintliche Langsamkeit von Webseiten oder schlechte Ergebnisse bei SpeedTests beklagen. Wir verwenden PageSpeed Insights, um das Ergebnis zu überprüfen. Was genau wird jedoch mit einem SpeedTest wie PageSpeed Insights gemessen? Ist der Aufbau einer Webseite nicht viel komplexer als nur HTML, CSS, Grafiken, JavaScript und dessen Rendering?
Beim Speedtest von PageSpeed Insights handelt es sich um einen sogenannten Blackbox Test, was bedeutet, dass der Test ohne Kenntnisse über die innere Funktionsweise der zu testenden Webseite durchgeführt wird. Entsprechend kann der Test auch nur bedingt Rückschlüsse darüber liefern, ob es Probleme mit der Programmarchitektur, langsamen Datenbankabfragen, nicht optimiertem Programmcode oder anderen Serverseitige Probleme gibt. Stattdessen konzentriert sich der Speedtest von PageSpeed Insights darauf, die visuelle Ladezeit zu messen und Empfehlungen zu geben, wie diese verbessert werden kann. Hierzu werden typischerweise Informationen zur erforderlichen Ladezeit von Bildern, Skripten und anderen Ressourcen gesammelt und anschliessend in Hinblick auf mögliche Optimierungen oder Änderungen analysiert.
Bei der Interpretation der Werte von PageSpeed Insight (Lighthouse) muss beachtet werden, dass die Werte der Ladezeiten und insbesondere des Renderings auf einem emulierten Moto G4 beruhen. Das Moto G4 wurde 2016 veröffentlicht und verfügt über folgende Spezifikationen: 2GB RAM, 1,5 GHz 8-Core CPU. Um die Testergebnisse für Mobilgeräte zu ermitteln, wird seitens PageSpeed Insight zudem meist eine «Langsame 4G-Drosselung» angewendet. Ob die Wahl des Geräts und die sonstigen Annahmen für die Schweiz repräsentativ sind, kann bezweifelt werden. Trotzdem liefert uns der Speed Test einige interessante Informationen und Hinweise, welche durch eine korrekt Interpretation einige spannende Lösungsansätze für die Speed Optimierung bieten.
Beim Speedtest wird oft nur die Startseite überprüft. Bei grossen Websites steigen jedoch teilweise sogar weniger als 1% der Besucher über die Startseite ein.
Resultate von PageSpeed Insights korrekt interpretieren
Bevor man sich mit dem Abarbeiten der Empfehlungen abmüht, welche PageSpeed Insights vorschlägt, sollte man zuerst lernen, die Metriken wie First Contentful Paint oder Time to Interactive zu verstehen. Dies ist besonders wichtig, da die Analyse seitens PageSpeed Insights nur technische Metriken misst, was mit der tatsächlich gefühlten Ladezeit oft nicht übereinstimmt. Versteht man es nicht, die Metriken korrekt zu interpretieren, setzt man bei der Performanceoptimierung möglicherweise am falschen Ort den Hebel an.
First Contentful Paint (FCP)
Der Browser hat den ersten Teil des Inhalts aus dem DOM gerendert und gibt dem Benutzer die erste Rückmeldung, dass die Seite tatsächlich geladen wird.
> Indikator, wie schnell die Website Serverseitig verarbeitet wurde und ob serverseitige Optimierungen notwendig sind
Largest Contentful Paint (LCP)
Misst, wie lange es geht bis das grösste Inhaltselements auf der Webseite, z.B. ein Slider oder die Hero-Section, für die Besucher geladen und gerendert ist.
> Indikator, wie schnell die Website gerendert wird und ob der Content der Website optimiert werden sollte
Total Blocking Time (TBT)
Der TTI misst den frühesten Zeitpunkt nach dem First Contentful Paint (FCP), an dem die Seite zuverlässig für die Interaktivität des Benutzers bereit ist. TBT misst die Gesamtzeit, in der die Webseite blockiert war und den Nutzer daran hindert, mit der Seite zu interagieren.
> Indikator, ob zu viel JavaScript, SVG verarbeitet werden muss und deferred/async Loading angewandt werden soll
Ein hoher Wert bei First Contentful Paint (FCP) deutet auf Serverseitige Probleme wie schlecht strukturierten Code oder nicht optimierte Datenbankabfragen hin. Bei einem hohen Largest Contentful Paint (LCP) sollte das Augenmerk bei der Optimierung zuerst auf dem Inhalt und den Assets wie Bildern und JavaScript liegen.
Hilfsmittel zur Identifizierung der Performance Probleme bei WordPress Websites
Wir haben zuvor bereits PageSpeed Insights kennengelernt. Es wird von Anwendern gerne genutzt, wenn es um die Ermittlung von Performance Metriken geht. PageSpeed Insights kann uns einige interessante Einblicke und Hinweise geben, wo wir mit unseren Anstrengungen zur Speed Optimierung ansetzen sollen.
Das World Wide Web ist viel komplexer als in der vereinfachten Grafik oben dargestellt. Beginnt man sich intensiv mit der Performanceoptimierung von Websites auseinanderzusetzen, merkt man schnell, dass hierfür ein vertieftes Wissen in vielen Disziplinen der Informatik notwendig ist. Bedenkt man, welche Technologien alle genutzt werden bis unsere Website auf dem Bildschirm der Besucher unserer Website erscheint, kann man ganz einfach einen ganzen Strauss an verschiedenen Technologien aufzählen welche dafür nötig sind.
Performance Optimierung ist keine einfache Disziplin, bedenkt man die Komplexität von Computernetzwerken. Um Flaschenhälse von WordPress Website in diesem komplexen Umfeld zu erkennen und zu beheben, muss man die richtigen Tools und Instrumente kennen und wissen wie diese korrekt eingesetzt werden. Um die richtigen Ansatzpunkte für die Speedoptimierung zu finden, müssen wir lernen, die Werte korrekt zu interpretiert. Folgende Hilfsmittel helfen bei der Erhebung von wichtigen Metriken.
Folgende Tools helfen bei der Identifizierung von Performance Problemen
Wie, was und wo muss ich optimieren, um die Ladezeiten zu verbessern?
Nachdem wir nun besser verstehen, wie die Werte von PageSpeed Insight korrekt zu interpretieren sind, können wir daraus einen Grundsatz ableiten.
Nachfolgend werden wir nun einige Methoden vorstellen, wie die Performance von WordPress Websites stark verbessert werden kann. Wir erklären, welche Metriken beachtet werden müssen, um Probleme zu erkennen und geben Tipps zur Fehlerbehebung. Bevor wir richtig loslegen, möchten wir jedoch noch zuerst zwei weitere wichtige Instrumente zur Identifizierung von Problemen vorstellen.
Query Monitor (WordPress Plugin)
Das Plugin Query Monitor ist unverzichtbar, wenn es um die Identifizierung von Performance Schwachstellen geht. Es hilft zuverlässig beim Identifizieren von langsamen, nicht optimierten Datenbankabfragen und schlecht programmierten Plugins. Neben den Datenbankabfragen, zeigt Query Monitor auch die gesamte Zeit welche für die Seitengenerierung benötigt wird. Hier sollte immer eine Gesamtzeit für die Generierung von unter 1 Sekunde angestrebt werden. Unser Beispiel liegt mit 1.36 Sekunden über dem angestrebten Wert, dies weil es sich hier um eine sehr lange und komplexe Inhaltsseite handelt und der Kunde hier eine etwas längere Wartezeit in Kauf nimmt.
Das Plugin Query Monitor sollte nur zur Identifizierung von Flaschenhälsen aktiviert sein und in jedem Fall nach der Behebung der Probleme wieder deaktiviert werden.
WP_DEBUG_LOG
Mittels der Option WP_DEBUG_LOG, welche in der Konfigurationsdatei von WordPress (wp-config.php) gesetzt werden kann, zwingt man WordPress, alle PHP Fehler zu protokollieren. Durch die korrekte Kombination der Optionen WP_DEBUG, WP_DEBUG_DISPLAY und WP_DEBUG_LOG werden alle Fehler in eine Logdatei umgeleitet, statt diese den Besuchern anzuzeigen. Die Logdatei wiederum kann sporadisch auf Fehler überprüft werden. Teilweise findet man dank der Datei debug.log Fehler in Plugins, welche sich negativ auf die Performance auswirken.
Die Option WP_DEBUG_LOG sollte nur während der Durchführung der Problemanalyse aktiviert sein, da sich die dadurch ausgelöste Protokollierung selbst ebenfalls negativ auf die Performance auswirkt.
Strukturelle Datenbankprobleme von WordPress
WordPress ist flexibel und sehr einfach erweiterbar. Mit zusätzlichen Plugins kann WordPress problemlos um jede vorstellbare Funktion erweitert werden. Dieser Umstand verdankt WordPress nicht zuletzt auch seiner einfachen und flexiblen Datenbankstruktur. Diese ist hinsichtlich auf die Flexibilität genial, hinsichtlich der Performance hat diese jedoch einige Schwächen. Kenn man die Schwächen der Datenbankstruktur von WordPress, kann man diese umgehen und erreicht schnellere Ladezeiten von Websites.
Die Tabelle wp_postmeta
WordPress speichert die Inhalte und Eigenschaften aller Beiträge grundsätzlich in den zwei Tabellen wp_posts und wp_postmeta. Der eigentliche Inhalt des Beitrags wird dabei in der Tabelle wp_posts abgelegt. Zusätzliche Eigenschaften (alle Custom Fields) in der Tabelle wp_postmeta.
Die Struktur der Datenablage innerhalb der Tabelle wp_postmeta kann zu Performanceproblemen führen, da die Ablage der Daten über ein Key/Value-Zuweisung erfolgt. Der Nachteil ist dabei, dass die Informationen aus der Tabelle wp_postmeta nicht mit einer einzelnen Datenbankabfrage gesamthaft ausgelesen werden können, dies weil sich die Stuktur der Datentabelle nicht in der optimalen Normalform befindet. Will man beispielsweise alle Informationen eines bestimmten Beitrags auslesen, muss man jede Eigenschaft einzeln aus der Datenbank laden, statt alle zum Beitrag gehörenden Eigenschaften auf einmal. Das führt zu vielen zusätzlichen Datenbankabfragen, was sich negativ auf die Performance auswirkt.
Die Lösung dieses Problems bieten z.B. Plugins wie «MetaBox.io» oder «ACF to Custom Database Tables». Diese Plugins ermöglichen es, die Inhalte in der optimalen Normalform für Datentabellen abzulegen, statt diese in der Key/Value Tabelle von WordPress zu speichern. Bei sehr dynamischen und grossen Websites oder Webverzeichnissen lohnt es sich, die Daten aus der Tabelle wp_postmeta in der idealen Normalform abzulegen, um unnötige Datenbankabfragen zu vermeiden.
Die Hierarchie von Kategorien, Tags und sonstigen Taxonomien
Grundsätzlich kennt man für das Abbilden von hierarchischen Daten innerhalb einer Datenbank verschiedene Ansätze wie z.B. Nested Sets oder Parent-Child. Wobei WordPress das Parent-Child Modell verwendet. Dabei kann jede Taxonomie als Parent entweder den Wert 0 haben (für keine übergeordnete Taxonomie) oder die ID einer anderen Taxonomie.
Die Parent-Child Struktur hat den Nachteil, dass beim Auslesen der Informationen die Datenbankabfragen exponentiell pro Hierarchiestufe steigen. Dieser Umstand verlangsamt oft z.B. Onlineshops welche mit WooCommerce realisiert sind. Will man beispielsweise alle Produkte einer bestimmen Kategorie und aller Unterkategorien auslesen, können bei einer tiefen Verschachtelung der Kategorien sehr viele Datenbankabfragen nötig werden um alle Produkte zu finden.
Die Lösung dieses Problems kann sein, bewusst auf mehr als 2 Hierarchiestufen zu verzichten. Alternativ müssen Indizes erstellt werden. Bei 5000 Kategorien verteilt auf 7 Hierarchiestufen dauert die Erstellung des Index ca. 15-30 Sekunden. Führt man die Erstellung des Index regelmässig im Hintergrund aus, verbessert man die Performance bei jeden Klick eines potenziellen Kunden im Onlineshop um mehrere Sekunden.
Datenbank Relations
WordPress bietet keine Best Practice, um sogenannte Relations zwischen verschiedenen Post Types abzubilden. Um Relations zu erstellen, werden zusätzliche Plugins benötigt. Einige dieser Plugins nutzen zum Abspeichern der Relations die Tabelle wp_postmeta. Wie oben erklärt, hat diese Tabelle strukturelle Probleme und sollte keinesfalls für das Speichern von Relations verwendet werden. Deshalb empfiehlt es sich, auf ein Plugin wie MetaBox.io oder JetEngine zu setzen, da diese die Relations in einer eigens dafür erstellten Tabelle ablegen.
Werden Relations in der Tabelle wp_postmeta abgelegt, führt dies früher oder später zu Problemen mit der Performance.
Bevor wir starten – genügt das Webhosting?
Bevor wir beginnen Massnahmen zur Performanceoptimierung umzusetzen, sollten wir das Hosting prüfen. Relevant sind folgende Metriken:
Wir erlauben uns hier eine persönliche Empfehlung zum Hosting abzugeben:
Auch andere Hosting Anbieter wie Hostpoint, Metanet, Hoststar, Infomaniak oder Cyon können für das Hosting in Betracht gezogen werden. Hosttech, Webland und sonstige kleine Anbieter haben sich gemäss unserer Erfahrungen als ungeeignet für das Hosting von WordPress erwiesen. Diese Liste bildet sich aus den Erfahrungen unserer Agentur aus den letzten 15 Jahren.
Ein Hosting-Wechsel eines Onlineshops von einem beliebigen Schweizer Hosting Anbieter zu WP Hosting Schweiz hat die Ladezeiten von 10 Sekunden auf 2.5 Sekunden reduziert, ohne das weitere Massnahmen nötig waren.
Let’s go – WordPress Performance optimieren
Nachdem wir die Schwachstellen der WordPress Datenstruktur kennen und wissen, wie wichtig der passende Hostingpartner ist, können wir jetzt verschiedene Massnahmen zur Performanceoptimierung genauer betrachten.
Wir konzentrieren uns nicht auf einzelne Plugins, welche einen besseren Score beim Speedtest versprechen, vielmehr erklären wir die Techniken dahinter welche angewandt werden, um den Speed einer Website tatsächlich nachhaltig zu steigern.
Disk Cache, Browser Cache, Object Cache (Redis/Memcached)
Werden Performance Probleme festgestellt, wird oft versucht die Ladezeit zu verbessern, indem ein zusätzliches Plugin installiert wird. Einige Plugins wie WP Rocket, Hummingbird Pro oder W3 Total Cache versprechen auf Knopfdruck eine Verbesserung der Ladezeiten. Wir haben alle diese und weitere Performance Plugins installiert und ausprobiert, mit gutem aber auch mit mässigem Erfolg. Teilweise wurde die Website sogar langsamer. Wie kann das sein?
Browser Cache
Eine einfache und effiziente zur Verbesserung der Ladezeiten der eigenen Website ist aktivieren des Browser Caches. Dadurch wird der Browser des Besuchers angewiesen, statische Inhalte wie Bilder, Grafiken, CSS und Javascript für einen bestimmten Zeitraum im lokalen Speicher zwischenzuspeichern. Gleich und unveränderte Dateien müssen somit nicht wiederholt vom Server zum Client übermittelt werden, was die Ladezeiten beim wiederholten aufrufen der Homepage oder von Unterseiten verbessert.
Mittels der Datei .htaccess kann der Browser des Besuchers angewiesen werden, die Inhalte von spezifischen Dateitypen wie z.B. alle JPEG-Bilder oder alle CSS-Dateien für einen bestimmten Zeitraum lokal zwischenzuspeichern und jeweils direkt aus dem internen Cache zu laden.
Page Caching
Mittels Page Caching wird versucht, Ressourcenengpässe seitens der Serverinfrastruktur wie zu wenig RAM oder zu wenig CPU-Leistung zu verhindern oder zu umgehen, indem man die Serverressourcen schont und die Anzahl an rechenaufwändigen und ressourcenintensiven Aufgaben reduziert. Um die Ressourcen zu schonen, weisen Plugins wie WP Rocket, Super Cache oder W3 Total Cache den Server an, die Ergebnisse der nötigen Berechnungen zur Bereitstellung einer Website in Dateien auf der Festplatte oder im Arbeitsspeicher zwischenzuspeichern. Damit wird erreicht, dass die ressourcenaufwendigen Berechnungen nicht bei jedem Aufruf der Website wiederholt ausgeführt werden müssen, vielmehr kann bei wiederholtem Aufrufen der Website das Ergebnis direkt aus dem Zwischenspeicher geladen werden, ohne dass die Berechnungen erneut ausgeführt werden müssen.
Das Dilemma von Page Caching ist, dass es bei statischen Websites keinen nennenswerten Performance Vorteil bringt und bei komplexen dynamischen Websites Fehleranfällig ist. Bei wenig komplexen Websites bringt Page Caching nur einen geringen Performancevorteil gegenüber der wiederholten Berechnung und Bereitstellung der Inhalte mittels CPU & RAM. Dies, weil der Zugriff auf das Dateisystem und das Öffnen der in der Datei enthaltenen Informationen ebenfalls eine gewisse Zeit in Anspruch nimmt. Wenn keine SSD Disks im Einsatz sind, ist von Page Caching definitiv abzuraten.
Seiten-Caching mit WP Rocket und Co. kann die Auswirkungen von nicht optimiertem Code oder unzureichenden Ressourcen ausgleichen.
Persistenter Object Cache (Redis/Memcached)
Ein persistenter Objekt-Cache hilft, die Ladezeiten von Seiten zu verkürzen, indem er dem Webserver Wege zur Datenbank erspart. Beim Caching von Objekten werden die Ergebnisse von Datenbankabfragen gespeichert, so dass beim nächsten Mal ein Ergebnis aus dem Cache abgerufen werden kann, ohne die Datenbank wiederholt abfragen zu müssen.
WordPress implementiert Object Caches über WP_Object_Cache. Dabei ist das Caching standardmässig nicht-persistent. Das bedeutet, dass die Daten im Cache nur für die Dauer der Anfrage gespeichert werden. Zwischengespeicherte Daten werden nicht dauerhaft und über mehrere Requests hinweg gespeichert. Will man eine persistente Speicherung der Daten erreichen, muss man ein zusätzliches Plugin installieren, welches einen persistenten Speicher wie Redis oder Memcached implementiert.
Wer weder Memcached noch Redis zur Verfügung hat, kann auf das Plugin «Docket Cache» ausweichen, um einen persistente Speicherung der Informationen zu erreichen.
Der Einsatz eines persistenten Object Caches kann tatsächlich einen Unterschied ausmachen und die Performance der Website positiv beeinflussen.
Nginx als Reverse Proxy
Ein Reverse-Proxy sitzt vor einem Webserver und empfängt alle Anfragen, bevor sie den Zielserver erreichen. Entsprechend kann der Reverse-Proxy zur Beschleunigung der Performance eingesetzt werden, indem er sowohl statische als auch dynamische Inhalte zwischenlagert und dadurch die Last auf den Zielserver verringert. Varnish Cache und Nginx FastCGI sind bekannte Beispiele für Reverse Proxies.
Nginx eignet sich hervorragend für den Umgang mit mehreren gleichzeitigen Benutzern, ohne dabei viele Serverressourcen zu verbrauchen. Apache ist extrem schnell für die effiziente Verarbeitung von PHP. Einige Schweizer Hosting Anbieter bieten aus diesem Grund die Möglichkeit, Nginx als Reverse Proxy einzusetzen, um das Beste aus beiden Welten zu kombinieren.
Nginx als Reverse Proxy kann einige Millisekunden an zusätzlichem Speed bringen und dabei helfen, die Serverressourcen zu schonen, damit immer genügend Ressourcen zur Verarbeitung der restlichen Anfragen zur Verfügung stehen.
Jetzt wird’s spannend – Fragment Cache
Nachdem wir einige Möglichkeiten des serverseitigen Zwischenspeicherns von Daten kennengelernt haben, möchten wir uns hier noch mit der fortgeschrittenen Methode des Fragment Caching befassen.
Page Caching einer gesamten Website hat einige Nachteile, weil der Code zur Generierung der Inhalte nicht mehr durchlaufen wird. So können beispielsweise keine Benutzerstatistiken mehr erfasst werden, sofern diese nicht mit JavasScript eingebunden sind. Auch ist eine Umleitung der Benutzer nach Sprachregion oder Herkunftsland nicht mehr möglich, da der dafür nötige Code möglicherweise nicht mehr ausgeführt wird. Um diese Probleme zu umgehen eignet sich Fragment Caching.
Statt nur die Datenbankabfrage zwischenzuspeichern, wie das ein persistenter Object Cache ermöglichen würde, wird beim Fragment Cache zusätzlich die Programmlogik vorgängig durchlaufen und als Ergebnis das gesamte zur Darstellung benötigte HTML aufbereitet und zwischengespeichert. Im Beispiel oben wird die Auflistung der beliebtesten Einkaufszentren zwischengespeichert. Um diese Auflistung bei jedem Request aufzubereiten, wird einiges an Ressourcen benötigt, welche wir durch das Zwischenspeichern der Informationen einsparen können, indem wir dieses Fragment anordnen, sich nur jede Stunde zu aktualisieren.
Fragment Caching steigert die Effizienz eines Object Caches zusätzlich.
Content Delivery Network (CDN)
Fast alle Plugins zur Optimierung der Website Performance wollen uns dazu bringen, einen CDN einzusetzen. Zur Profitoptimierung ist dies für die Hersteller der Performance Plugins besonders attraktiv, da für die Bereitstellung eines CDN’s oft eine zusätzliche monatliche Gebühr anfällt, welche die Betreiber der Websites bezahlen müssen. Doch wer braucht einen CDN wirklich und wann ist der Einsatz Sinnvoll?
CDN’s versprechen bessere Leistung und höhere Zuverlässigkeit. Doch wie funktioniert ein CDN im Detail und wie wird dadurch die Performance verbessert?
Besucht jemand beispielsweise die Website Shoppingtotal.ch, welche hier in der Schweiz auf einem Server gehostet wird, müssen jeweils alle Daten aus dem Serverzentrum in der Schweiz zum Bestimmungsort des Besuchers übermittelt werden. Je nach Standort des Besuchers müssen die Daten demnach einen kürzeren oder längeren Weg zurücklegen, bis diese am Zielort angelangt sind. Je nach Distanz nimmt die Datenübermittlung entsprechend mehr oder weniger Zeit in Anspruch.
Ein CDN kopiert und verteilt relevante Daten und Informationen einer Website in verschiedene Serverzentren auf der ganzen Welt, damit die Daten immer nur einen möglichst kurzen Weg bis zum Bestimmungsort zurücklegen müssen. Wenn nun ein Besucher unsere Website von einem beliebigen Standort auf der Welt abruft, werden die Daten jeweils aus dem nächstgelegenen Serverzentrum abgerufen und nicht zwingend aus dem Serverzentrum in der Schweiz.
Grundsätzlich macht der Einsatz eines CDN nur dann Sinn, wenn ein Unternehmen international ausgerichtet ist und entsprechend der Zugriff auf die Website des Unternehmens aus der ganzen Welt erfolgt. Kommt der Traffic, wie im Beispiel oben, hingegen zu 85% aus der Schweiz, ist ein CDN nur dann nötig, wenn sich der Serverstandort nicht in der Schweiz befindet.
CDNs sind nur bei grossem multinationalem Traffic und bei vielen internationalen Besuchern nötig.
Themes, Page Builder & Content-Optimierung
Wir haben bereits einige Strategien und Möglichkeiten zur Performanceoptimierung von WordPress kennengelernt. Hier machen wir gedanklich nochmals einen Schritt zurück und kümmern uns um die Wahl des WordPress Themes und des Page Builders.
Jeder Experte wird bestätigen, wie wichtig das Fundament eines jeden Systems in Bezug auf Stabilität, Sicherheit und Leistung ist. Entsprechend müssen wir die Wahl des Themes und des dazugehörigen Page Builders sorgfältig treffen und dabei einige Grundsätze beachten.
Der seit WordPress 5.0 verfügbare neue Inhaltseditor mit dem Namen «Gutenberg Editor» hat bei seiner Einführung am 8. Dezember 2018 für einiges an Aufregung gesorgt. Zugegeben, mehrheitlich in negativer Hinsicht. Kurz gesagt: Er war voller Fehler und wirkte unausgereift, was viele bei einem so beliebten Projekt wie WordPress nicht erwartet hätte. Jedoch war der Rückstand gegenüber anderen Inhaltseditoren so gross, dass er einfach raus musste. Seit der Veröffentlichung hat sich jedoch vieles verbessert. Ein grosser Vorteil hatte der Gutenberg Editor von beginn weg, er integriert sich nahtlos in WordPress und lässt ihn nicht als Fremdkörper wirken wie z.B. der Divi Builder oder Elementor. Ein weiterer Vorteil des Gutenberg Editors ist, dass er sowohl im Backend wie auch im Frontend in Bezug auf die Performance gegenüber den anderen Inhaltseditoren die Nase vorne hat.
Ein Loblied auf den Gutenberg Editor zu singen wäre (noch) unangemessen. In Bezug auf die Performance ist er jedoch schon jetzt Spitze!
Optimieren der Inhalte
Wer von euch traut sich, dem Grafiker oder dem Kunden zu widersprechen? Spätestens wenn es um die Performanceoptimierung geht, solltet ihr es lernen!
Content is King! Diese Aussage gilt nach wie vor für die Suchmaschinenoptimierung. Wenn wir eine Website jedoch hinsichtlich seiner Ladezeiten optimieren müssen, kommen wir nicht drum herum, dass wir gewisse Inhaltselemente hinterfragen müssen. Welche Inhalte sind für die Besucher und die Suchmaschinen relevant, welche können weggelassen werden? Optimieren bedeutet auch reduzieren. Reduzieren von Datenbankabfragen, Bildern und sonstigen Assets. Jede weggelassene Abhängigkeit, jede Datenbankabfrage weniger und jedes nicht geladene Bild beschleunigt letztendlich die Ladezeit der Website.
Optimieren bedeutet nichts geringeres als reduzieren.
GZIP Komprimierung
Die GZIP-Komprimierung ist eine einfache und wirksame Methode, um Bandbreite zu sparen und die Ladezeiten von Websites zu verbessern. Die Komprimierung ist schnell aktiviert und hat keinerlei negative Nebeneffekte wie zum Beispiel bei anderen Optimierungsverfahren wie Combine & Minify von JavaScript und CSS auf Plugin-Basis, welches sehr fehleranfällig ist.
Alle modernen Browser enthalten standardmässig Support für die GZIP-Komprimierung, entsprechend kann es problemlos eingesetzt werden. GZIP ermöglicht es, die Grösse der HTML-Seiten, Stylesheets und Skripte von Webseites zu reduzieren. Dabei erreicht GZIP normalerweise für kleine Daten eine Kompressionsrate von etwa 70% und für grosse textbasierte Daten bis zu 90%.
Um die GZIP-Komprimierung auf Apache-Servern aktivieren zu können, müssen Sie die Module mod_filter und mod_deflate installiert sein. Ist das der Fall, kann GZIP in der .htaccess-Datei konfiguriert werden. Noch einfacher geht es mit Plugins wie WP Rocket oder Hummingbird Pro, welche die nötigen Zeilen zum aktivieren von GZIP automatisch in die .htaccess Datei einfügen.
GZIP aktivieren. Eine der einfachsten Massnahmen für eine bessere Performance.
Expires Headers / Cache-Control
Expires-Header werden benötigt, um das Browser-Caching zu nutzen und um die Ladezeiten von Webseiten zu beschleunigen. Mit den Expires-Headern wird dem Webbrowser eines Besuchers mittgeteilt, ob dieser eine bestimmte Ressource (Bild, CSS, JavaScript etc.) aus dem lokalen Browser-Cache laden soll oder ob eine neue Version vom Webserver herunterladen werden muss. Es gibt auch noch eine andere Technik, um das Browser-Caching zu kontrollieren, welche Cache-Control genannt wird. Cache-Control ist eine modernere Technik und bietet ein wenig mehr Flexibilität als Expires-Headers.
Expires Header werden in der .htaccess Datei konfiguriert, indem man die entsprechenden Anweisung hinzufügt. Eine solche Anweisung könnte lauten «ExpiresByType image/jpg access 1 year». Mit dieser Anweisung teilen wir dem Browser des Besuchers mit, alle Dateien vom Typ JPEG für 1 Jahr im lokalen Cache zurückzuhalten. Alternativ kann auch ein Plugin wie WP Super Cache, W3 Total Cache oder WP Fastest Cache verwendet werden, welches die Anweisungen automatisch in die .htaccess Datei schreibt.
Cache-Control zu aktivieren ist eine einfache Massnahme, die Performance einer Website zu verbessern.
PHP Version & Code Optimierung
Die richtige PHP Version zu verwenden kann WordPress beschleunigen. So zeigt ein Benchmark Test von Cloudflare eine bessere durchschnittliche Response Time von 20% von PHP 8 gegenüber PHP 7.4. Leider hinkt WordPress in der Entwicklung hinterher, weshalb die neusten PHP Versionen oft erst Jahre nach deren Einführung sicher verwendet werden können.
Wichtig für die Performance ist jedoch nicht nur die Verwendung der neusten Version von PHP. Auch die Qualität des Codes ist von Bedeutung, entsprechend muss bei der Entwicklung darauf geachtet werden, dass keine PHP Warnings entstehen. Auch wenn die Ausgabe von PHP-Warnings im Frontend ohne weiteres unterdrückt werden können, sind diese hinsichtlich der Performance einer Website nicht zuträglich und sollten wenn immer möglich zu 100% eliminiert werden.
Schlecht geschriebene Datenbankabfragen
Um den Benutzern eine Liste der neuesten Artikel anzuzeigen könnte eine einfache SQL-Abfrage wie `SELECT * FROM wp_posts ORDER BY post_date ASC` verwendet werden und später in PHP mit `array_slice($array, 0, 5)` auf 5 beschränkt werden. Das Problem dabei ist, dass alle Artikel aus der Datenbank gelesen werden, was unter Umständen viel Zeit in Anspruch nimmt und die Leistung beeinträchtigt. Ein besserer Ansatz ist es, die SQL-Abfrage mittels LIMIT einzuschränken.
Dies ist nur ein Beispiel einer schlecht geschriebenen Datenbankabfrage. Die folgenden Grundsätze sollte man bei Datenbankabfragen beachten:
Fehlende Caching-Strategie
Da Caching‑Methoden einen klaren Mehrwert hinsichtlich der Ladezeiten von Websites bieten, sollte für jede Website eine geeignete Caching Strategie entwickelt werden, welche die eingesetzten Arten des Caching definiert und den Einsatz dieser beschreibt. In eine Caching Strategie sollten folgende Caching Methoden einbezogen werden:
Erstellung von Indizes mit Hintergrundprozessen
Ein Index ist eine Datenstruktur, die speziell für die effiziente Suche und Sortierung von Daten entwickelt wurde. Es ermöglicht es, Daten in einer bestimmten Reihenfolge zu organisieren und schneller darauf zuzugreifen. Wenn man eine Datenbankabfrage ausführt, kann das System den Index verwenden, um schnell auf die relevanten Daten zuzugreifen, anstatt die gesamte Datenbank durchsuchen zu müssen. Dadurch wird die Geschwindigkeit der Abfrage erheblich verbessert. Bekannte Beispiele sind z.B. der Suchindex von Search WP oder Relevanssi. Weiter erstellen viele WooCommerce Filter Plugins einen Index für die Anzahl Produkte nach Kategorie. Solche Indizes können die Performance von WordPress erheblich steigern.
Es ist jedoch wichtig zu beachten, dass das Erstellen von Indizes auch einige Nachteile haben kann. Es verbraucht Speicherplatz und erhöht die Zeit, die benötigt wird, um neue Daten hinzuzufügen oder Daten zu ändern. Daher ist es wichtig, die Indizes mittels eines Hintergrundprozesses zu erstellen, welcher beispielsweise jede Nacht automatisch ausgeführt wird.
Probleme mit externen APIs
Viele moderne Webanwendungen sind auf APIs von Drittanbietern angewiesen. So kann eine Anwendung beispielsweise auf einen E-Mail-Server angewiesen sein, um Transaktions-E-Mails zu versenden, auf einen Zahlungsabwickler, um Bestellungen zu bearbeiten, oder auf ein Content Delivery Network (CDN), um Bilder zu hosten.
Statt immer wieder bei jeder Anfrage die Geodaten einer Adresse über eine API auflösen zu lassen, sollte das Resultat nach der ersten Abfrage in der Datenbank gespeichert werden, damit zukünftig die bereits zuvor aufgelösten Werte geladen werden.
CDNs sind nur bei grossem multinationalem Traffic und bei vielen internationalen Besuchern nötig.
Image Compressing & Lazy Load
Image Compressing Plugins für WordPress wie Smush oder Imagify erfreuen sich grosser Beliebtheit. Aus gutem Grund, denn Bilder beeinflussen die Ladezeiten von Websites massgeblich, weshalb wir ein grosses Augenmerk auf deren Grösse legen sollten. Um die Geschwindigkeit einer WordPress-Website zu verbessern, müssen die Bilder für das Web optimiert werden. Plugins wie Smush oder Imagify nehmen uns die manuelle Arbeit ab und optimieren die Bilder automatisch direkt nach dessen Upload in die Mediathek und verringern die Dateigrösse ohne sichtbare Qualitätsverluste.
Lazy Loading von Bildern und Maps
Lazy Loading ist eine Strategie, um Ressourcen als nicht blockierend (nicht kritisch) zu identifizieren und diese nur bei Bedarf zu laden. Auf diese Weise können die Ladezeiten verkürzt werden. Mittlerweile unterstützen alle modernen Browser die Anweisung loading=lazy für Bilder und Iframes, weshalb durch die konsequente Anwendung dieses Attribute auf alle Bilder und Iframes die Ladezeiten einer Website auch ohne zusätzliches Plugin bereits massiv verbessert werden kann.
Plugins wie WP Rocket oder Hummingbird Pro verwenden meist nicht die im HTML Standard verankerte Implementation von loading=lazy, sondern lösen das Nachladen der Bilder mittels JavaScript aus. Dafür braucht es logischerweise zusätzlichen JavaScript Code, welcher wiederum das Rendering der Website blockiert, trotzdem führt es aber zu einem massiven Performancegewinn. Mittels Lazy Loading werden Bilder oder Maps erst geladen, wenn diese in den sichtbaren Bereich des Browsers kommen. Somit verhindert man ein frühzeitiges Laden von Ressourcen und lädt diese exakt zu dem Zeitpunkt, an welchem diese tatsächlich benötigt werden.
Nicht nur für Bilder – Lazy Loading
Lazy Loading kann theoretisch auf jede Art von Inhalt angewandt werden. Leider können Suchmaschinen damit nicht wirklich umgehen, weshalb aus Überlegungen der Suchmaschinenoptimierung auf das Nachladen von Informationen, welche für Suchmaschinen relevant sind, verzichtet werden sollte. Man könnte denken, dass Inhaltsblöcke, welche sowieso nur Canonical Links enthalten, bedenkenlos nachgeladen werden können. Dies ist bezüglich der Indexierung des Inhalts bedenkenlos möglich, jedoch meckert dann Google eventuell, weil sich der Inhalt zu stark verschiebt/verändert beim Scrollen durch die Website.
Bild-Kompression mittels Plugin funktioniert einfach und zuverlässig. Ein muss für jede WordPress Website.
Minimize, Combine und HTTP/2
Geht es um Speedoptimierung und WordPress, versuchen viele sich an sogenanntem Minify & Combining. Viele Plugins wie WP Rocket, WP Optimize oder Hummingbird Pro bieten spezielle Features, welche ein einfaches und sorgenfreies Kombinieren und Minimieren der Dateien versprechen. Leider versprechen diese oft zu viel bzw. es ist praktisch unmöglich, 20 oder mehr Dateien in einer einzigen Datei so zusammenzufassen, dass es keine Konflikte gibt.
Fuck it – ist Combine überhaupt nötig?
Während das Minimieren von Dateien seine Berechtigung hat und in der Regel auch sorgenfrei durchgeführt werden kann, da es nicht zur Laufzeit durchgeführt werden muss, ist das Kombinieren von Dateien eine herausfordernde Aufgabe. Besonders, da bei Fehlern in der Zusammenführung dazu führen können, dass einige Teile der Website nicht mehr funktionieren. Braucht es diesen Balanceakt in Zeiten von HTTP/2 und HTTP/3 überhaupt noch?
In einer idealen Welt hätten wir nur wenige Abhängigkeiten und unser Website würde nicht 40 oder mehr Styles und Scripts benötigen. Mit WordPress ist dieses Szenario jedoch nicht realistisch, auch in Zukunft werden komplexe Websites einige Abhängigkeiten benötigen. Im Jahr 2015, Google und Microsoft sei Dank, wurde das Protokoll HTTP/2 spezifiziert und das Leben von uns und zahlreichen anderen Entwicklern wurde einfacher. Die neuen Spezifikationen bieten die Möglichkeit des Zusammenfassens (Multiplex) mehrerer Anfragen. Das bedeutet, mühsames Combining von Dateien seitens WordPress ist nicht mehr wichtig und man kann sich diesen Balanceakt getrost sparen.
Fuck it – Fehleranfälliges Combining von Scripts und CSS sind die Mühen nicht Wert.
Scripts: async, defer
Wird ein Script geladen, sollte man darauf achten, dass die Ladeleistung der Seite nicht beeinträchtigt wird. Wird ein Script wie üblich über die Anweisung «script» eingebunden, wird das Rendern an dieser Stelle blockiert, bis der Code im Script ausgeführt wurde. Erst wenn dieser Vorgang abgeschlossen ist, wird das Parsing des restlichen HTML-Dokuments fortgesetzt.
Async
Das async-Attribut ist für externe Skripte gedacht. Ist das Attribut gesetzt, wird das Skript parallel zum Parsen der Seite heruntergeladen. Sobald es verfügbar ist, wird es ausgeführt. Das Parsen der Seite wird unterbrochen und erst fortgesetzt, wenn das Script fertig ausgeführt ist.
Defer
Ist das Attribut defer gesetzt, wird das Skript parallel zum Parsen der Seite heruntergeladen und erst ausgeführt, nachdem das Parsen der Seite abgeschlossen ist.
Links und Redirects
Nicht notwendige Redirects können die Geschwindigkeit der Website positiv beeinflussen. Wenn die Zielseite eine Umleitung enthält, wiederholt der Browser den gesamten DNS-Auflösungsprozess noch einmal, um den Benutzer zur richtigen Webseite zu führen. Diese mehrfachen Weiterleitungsanfragen belasten die Browserressourcen und verlangsamen das Laden der Seite.
Beim setzen der Links sollte man die Struktur beachten, welche im WordPress Adminpanel unter Einstellungen › Permalinks gewählt wurde. Insbesondere sollte auch beachtet werden, ob eine Struktur mit Slash am Schluss gewählt wurde.
Cronjobs
WordPress bietet eine eigene Implementation von sogenannten Cronjobs (geplante Tasks). Alle Plugins können in der von WordPress bereitgestellten Schnittstelle eigene Cronjobs registrieren. Cronjobs werden in der Regel von jeder Sekunde bis zu ein mal pro Woche ausgeführt und dienen beispielsweise zur Bereinigung von nicht mehr benötigten Ressourcen oder erstellen im Hintergrund einen Suchindex oder ähnliches.
WordPress hat jedoch keine technischen Möglichkeiten, die Cronjobs tatsächlich im Hintergrund zu starten. Vielmehr werden die als Cronjobs erfassten Aufgaben von Besuchern der Website ausgeführt. Das kann dazu führen, dass wenn ein Besucher sich auf der Website bewegt, er unbewusst zusätzliche Wartezeit in Kauf nehmen muss, da er auch noch die Ausführung der Cronjobs abwarten muss.
Damit die Cronjobs tatsächlich im Hintergrund ausgeführt werden, muss ein echter Cronjob eingerichtet werden, welcher bspw. sekündlich den WP-Cron anstösst.
Cronjobs sollten im Hintergrund ausgeführt werden und als Drive-by von Besuchern der Website.