WordPress Performance optimieren: In 3 Schritten zum 95% PageSpeed Score

⚠️ Wichtiger Sicherheitshinweis:

Die folgenden Optimierungen greifen tief in die Systemsteuerung (.htaccess) und die Kern-Logik deines WordPress-Setups ein. Bevor du startest:

  • Erstelle unbedingt ein Backup deiner .htaccess und deiner Datenbank.
  • Diese Anleitung ist spezifisch für WordPress mit dem Astra-Theme auf einem Apache-Server optimiert.
  • Teste jede Änderung einzeln und prüfe die Seite danach im Incognito-Modus auf Funktionsfähigkeit.

Wenn du WordPress ernsthaft optimierst, kennst du das Ziel: 100 von 100 Punkten bei Google PageSpeed. Doch je tiefer ich in die Architektur eingestiegen bin, desto klarer wurde mir, dass dieser Wert oft ein Trugbild ist. Ein Theme wie Astra und ein DSGVO‑konformes Consent‑Tool wie Borlabs Cookie bringen zwangsläufig Overhead mit. Absolute Perfektion im Lighthouse‑Score bedeutet nicht automatisch ein besseres Nutzererlebnis.

Ich hatte diesen Moment: 98 Punkte, alles grün, alles perfekt. Und trotzdem habe ich die Konfiguration zurückgerollt. Heute fahre ich bewusst stabile 95 Punkte – und die Seite ist für echte Menschen schneller als zuvor.

In diesem Artikel zeige ich dir, wie ich diese Werte erreicht habe, warum ich bewusst nicht weiter optimiere und welche konkreten Code‑Snippets aus meiner performance.php den Unterschied machen.

1. Ausgangslage: Meine Messwerte und das Lighthouse‑Paradoxon

  • Leistung: 95
  • Barrierefreiheit: 100
  • Best Practices: 100
  • SEO: 100
  • FCP: 1,7 s
  • LCP: 2,9 s
  • TBT: 0 ms
  • CLS: 0
  • Speed Index: 1,7 s

Warum also nicht die 98 Punkte behalten? Die Antwort liegt im Unterschied zwischen Bot‑Messung und menschlicher Wahrnehmung.

2. Warum ich die 98 Punkte bewusst verworfen habe

Um die 98 Punkte zu erreichen, hatte ich alle CSS‑Dateien zu einem einzigen Block zusammengeführt. Für Lighthouse war das ideal – für echte Nutzer nicht.

2.1 Für den Bot sah alles perfekt aus

  • Der Browser wartete, bis der gesamte CSS‑Block geladen war.
  • Die Seite wurde in einem einzigen, sauberen Durchlauf gerendert.
  • LCP und CLS waren makellos.

2.2 Für den Nutzer war es ein Rückschritt

Bis der CSS‑Block geladen war, blieb der Bildschirm fast drei Sekunden weiß. Der Speed Index lag bei 2,7 Sekunden – technisch akzeptabel, subjektiv langsam.

Nach dem Rollback auf getrennte, parallel ladende CSS‑Ressourcen sank der Speed Index auf 1,7 Sekunden. Die Seite erscheint jetzt sofort, auch wenn der LCP rechnerisch steigt und Lighthouse drei Punkte abzieht.

Für mich ist klar: Ich optimiere für Menschen, nicht für Bots.

3. Meine Optimierungsstrategie: Ein Drei-Schichten-Modell

Die Performance dieser Seite basiert auf einem Zusammenspiel aus drei Ebenen: dem Server (.htaccess), dem Theme (functions.php) und der Kern-Logik (performance.php).

Technischer Hinweis: Die performance.php ist bei mir als Must-Use Plugin (MU-Plugin) implementiert. Sie liegt im Verzeichnis /wp-content/mu-plugins/. Der Vorteil: MU-Plugins werden von WordPress automatisch vor allen regulären Plugins geladen und können nicht versehentlich im Backend deaktiviert werden. Das macht sie zum perfekten Ort für kritische Performance-Eingriffe.

3.1 LCP‑Optimierung über HTTP‑Header und Bildattribute

Damit das Hero‑Bild sofort lädt, setze ich den Preload‑Impuls direkt im Header und ergänze ihn im Markup. Wir nutzen hier die „Power-Variante“, die auch statische Startseiten und den Blog-Index erkennt:

add_action('wp_head', function () {
    $lcp_url = '';
    if (is_front_page()) {
        $lcp_url = get_the_post_thumbnail_url(get_option('page_on_front'), 'large');
    } elseif (is_singular()) {
        $lcp_url = get_the_post_thumbnail_url(get_the_ID(), 'large');
    }

    if ($lcp_url) {
        header('Link: <' . esc_url($lcp_url) . '>; rel=preload; as=image; fetchpriority=high', false);
        echo '<link rel="preload" as="image" href="' . esc_url($lcp_url) . '" fetchpriority="high">';
    }
}, -200);

Zusätzlich passe ich die Bildattribute an, damit das LCP‑Element (und andere kritische Infografiken) nicht verzögert werden:

add_filter('wp_get_attachment_image_attributes', function ($attr) {
    if (isset($attr['class']) && str_contains($attr['class'], 'wp-post-image')) {
        $attr['loading']       = 'eager';
        $attr['fetchpriority'] = 'high';
        $attr['decoding']      = 'sync';
    }
    return $attr;
}, 999);

3.2 Der „Stille Killer“: Astra Autoload-Optimierung

Ein oft übersehener Performance-Fresser in WordPress sind die options-Tabelle und der autoload-Mechanismus. Das Astra-Theme lädt standardmäßig ca. 265 KB an Einstellungen bei jedem Seitenaufruf – auch wenn sie nur im Customizer gebraucht werden.

Wichtiger Hinweis: Diese Funktion sollte nicht bei jedem Seitenaufruf „nackt“ in der functions.php stehen, da die Datenbankabfrage sonst den Performance-Gewinn wieder auffrisst. Wir führen sie entweder einmalig manuell aus oder hängen sie an einen täglichen Wartungs-Cronjob.

In der functions.php entlasten wir die Datenbank so:

function seotologie_fix_autoload_issues() {
    global $wpdb;
    // Deaktiviere Autoload für große Theme-Settings
    $wpdb->query("UPDATE $wpdb->options SET autoload = 'no' WHERE option_name = 'astra-settings'");
    // Cleanup von verwaisten Transients, die den Autoload aufblähen
    $wpdb->query("DELETE FROM $wpdb->options WHERE option_name LIKE '_transient_astra_%'");
}

3.3 Serverseitiges Hardening & Caching (.htaccess)

Bevor WordPress überhaupt eine Zeile Code ausführt, sorgt die .htaccess für die nötige Basis-Geschwindigkeit. Drei Hebel sind hier entscheidend:

  1. Gzip-Kompression: Über mod_deflate werden Text-Ressourcen (HTML, CSS, JS) komprimiert an den Browser geschickt.
  2. Immutable Caching: Statische Dateien (Fonts, Logos) erhalten einen Cache-Control Header von einem Jahr mit dem Zusatz immutable. Einmal geladen, fragt der Browser nie wieder beim Server nach.
  3. 404-Bypass für statische Dateien: Wenn ein Bild fehlt, soll WordPress nicht versuchen, eine 404-Seite zu generieren (was eine teure Datenbank-Abfrage triggert). Wir fangen das direkt im Apache ab:
<FilesMatch "\.(css|js|ico|gif|jpg|jpeg|png|svg|webp|avif|woff|woff2)$">
    ErrorDocument 404 "File Not Found"
</FilesMatch>

3.4 JavaScript‑Kette entschärfen: Borlabs verzögert laden

Borlabs Cookie ist unverzichtbar, aber schwer. Um die TBT bei 0 ms zu halten, lade ich die Skripte kontrolliert verzögert. Wir nutzen hier ein Throttling-Script, das erst nach 1.000ms (nach dem LCP-Fenster) die echten Borlabs-Skripte nachlädt.

3.5 CSS-Strategie: Entkoppeln statt Blockieren

Um den schnellen Speed Index zu stabilisieren, extrahiere ich die wichtigsten Layout‑Styles in ein kritisches Inline-Stylesheet. Alles andere landet asynchron im Footer.

4. Warum 95 % mein strategisches Optimum sind (und der 100% Mythos)

Ein Score von 95 bei 0 ms TBT und lupenreinen 0 CLS ist für mich die perfekte Balance. Wenn du dich fragst, warum der LCP (Largest Contentful Paint) oft bei Werten um die 2,5 bis 2,9 Sekunden stagniert, lautet die Antwort meistens: Das Cookie-Banner.

Ein rechtssicheres Tool wie Borlabs Cookie muss (oft via Vue.js) geladen und ausgeführt werden, bevor der Nutzer interagieren kann. Genau in den kritischen Millisekunden, in denen der Browser eigentlich deinen ersten Textblock (das LCP-Element) auf den Bildschirm zeichnen möchte, ist der Main Thread durch das Evaluieren dieser Consent-Skripte blockiert. Dies erzeugt eine harte Rendering-Verzögerung.

Kann man das umgehen? Ja, indem man im Caching-Plugin (wie WP Rocket) zwingend „JavaScript verzögert laden“ (Delay JavaScript Execution) aktiviert. Das birgt jedoch das Risiko, dass das Banner auf Interaktionen nicht sofort reagiert oder rechtliche Lücken durch späte Initialisierung entstehen. Ich nehme hier ganz bewusst einen leichten LCP-Abzug in Kauf. 95 Punkte auf emulierten mobilen Geräten mit aktivem und reaktionsschnellem Cookie-Banner sind performanter und sicherer als hochgezüchtete 99% Laborwerte.

5. Was du aus meinem Ansatz mitnehmen kannst

  • Optimiere für Menschen, nicht für Bots.
  • Ein hoher Lighthouse‑Score ist kein Selbstzweck.
  • Speed Index und subjektive Wahrnehmung sind entscheidend.
  • Mit gezielten Eingriffen in performance.php kannst du WordPress auf ein beeindruckendes Niveau bringen.
  • Borlabs Cookie muss kein Performance‑Killer sein – wenn du die Skripte kontrollierst.

Und ein letzter Gedanke: Performance ist kein Zustand, sondern ein Prozess. Technologien ändern sich, Browser ändern sich, WordPress ändert sich. Wenn du langfristig schnell bleiben willst, musst du regelmäßig prüfen, messen und nachjustieren. Genau darin liegt die wahre Kunst der Optimierung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen