6. August 2026

Google Fonts lokal einbinden — ohne Plugin

Jede Schrift von fonts.gstatic.com schickt die IP deiner Besucher in die USA. Der Umbau auf lokale Dateien dauert zwanzig Minuten und braucht kein Plugin — inklusive der beiden Stellen, an denen ich trotzdem noch Requests gefunden habe.

Wenn deine Seite eine Schrift von fonts.googleapis.com oder fonts.gstatic.com lädt, überträgt der Browser deines Besuchers dessen IP-Adresse an Google — bevor irgendein Cookie-Banner gefragt hat. Ein Landgericht in München hat das 2022 als Verstoß gewertet, seither flattern Abmahnschreiben.

Der Umbau ist unspektakulär. Interessant ist die Frage, ob danach wirklich keine Requests mehr rausgehen.

Getestet mit

  • WordPress 6.8
  • Bricks 2.3.7 (funktioniert genauso mit jedem anderen Theme)
  • PHP 8.3

Schritt 1: Schriftdateien holen

Du brauchst nur woff2. Jeder Browser, der 2026 noch relevant ist, versteht das Format. Zusätzliche woff– oder ttf-Dateien sind Ballast.

Lade die benötigten Schnitte über den google-webfonts-helper herunter. Die API gibt dir die direkten Datei-URLs:

curl -s "https://gwfh.mranftl.com/api/fonts/inter?subsets=latin,latin-ext" | jq -r '.variants[] | select(.fontWeight=="400" or .fontWeight=="700") | .woff2'

Nimm nur die Schnitte, die du wirklich verwendest. Jeder zusätzliche Schnitt ist eine weitere Datei im kritischen Ladepfad. In der Praxis reichen fast immer zwei: Regular und Bold.

Schritt 2: Dateien ablegen

Ins Child-Theme, nicht ins Parent — sonst ist beim nächsten Theme-Update alles weg.

wp-content/themes/DEIN-CHILD-THEME/fonts/
  inter-400.woff2
  inter-700.woff2

Schritt 3: @font-face schreiben

In die style.css des Child-Themes:

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('fonts/inter-400.woff2') format('woff2');
}

@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('fonts/inter-700.woff2') format('woff2');
}

font-display: swap ist wichtig: Ohne die Zeile bleibt der Text unsichtbar, bis die Schrift geladen ist. Das kostet dich Punkte bei den Core Web Vitals und nervt echte Menschen.

Schritt 4: Vorladen

Die Schrift wird erst entdeckt, wenn das CSS geparst ist — also spät. Ein preload zieht sie nach vorne. In die functions.php des Child-Themes:

add_action( 'wp_head', function () {
    $dir = get_stylesheet_directory_uri() . '/fonts/';
    foreach ( [ 'inter-400.woff2', 'inter-700.woff2' ] as $file ) {
        printf(
            '<link rel="preload" href="%s" as="font" type="font/woff2" crossorigin>' . "n",
            esc_url( $dir . $file )
        );
    }
}, 1 );

Das crossorigin-Attribut sieht überflüssig aus, weil die Datei vom eigenen Server kommt. Es muss trotzdem hin: Schriften werden immer im CORS-Modus geladen. Ohne das Attribut lädt der Browser die Datei zweimal.

Der Request, der nach zwei Wochen wieder da war

Nach dem Umbau war die Seite sauber. In einem Audit vierzehn Tage später tauchte trotzdem wieder ein Aufruf an fonts.gstatic.com auf.

Es waren zwei Quellen, beide unsichtbar in der Theme-Konfiguration.

Die erste war der Block-Editor. WordPress lädt für die Block-Library eigene Schriften. Datenschutzrechtlich harmlos, weil nur im Backend — aber es hat mich eine Stunde gekostet, bis ich verstanden hatte, dass der Treffer aus dem Editor kam und nicht aus dem Frontend.

Die zweite war ein Formular-Plugin, das sein eigenes Icon-Set samt Google-Fonts-Aufruf mitbrachte. Sowas findest du nicht durch Lesen, sondern nur durch Messen:

curl -s https://DEINE-DOMAIN.AT/ | grep -oE 'https?://[^"]*(googleapis|gstatic)[^"]*'

Welche Datei den Aufruf auslöst, zeigt die Netzwerk-Registerkarte der Entwicklerwerkzeuge mit dem Filter gstatic und eingeblendeter Initiator-Spalte.

Den Aufruf des Plugins habe ich anschließend hart abgestellt:

add_action( 'wp_enqueue_scripts', function () {
    wp_dequeue_style( 'HANDLE-DES-PLUGINS' );
    wp_deregister_style( 'HANDLE-DES-PLUGINS' );
}, 100 );

Das Handle findest du über:

add_action( 'wp_print_styles', function () {
    global $wp_styles;
    error_log( print_r( $wp_styles->queue, true ) );
}, 999 );

Danach die Zeile wieder entfernen. Ein error_log im Produktivbetrieb ist der Anfang einer vollen Festplatte.

Kontrolle

Zwei Prüfungen, beide müssen leer ausgehen:

curl -s https://DEINE-DOMAIN.AT/ | grep -c 'gstatic|googleapis'

Erwartete Ausgabe: 0.

Danach die Seite im privaten Fenster öffnen, Entwicklerwerkzeuge, Netzwerk, Filter google. Die Liste muss leer bleiben — auch nach dem Scrollen bis ans Seitenende, denn nachgeladene Elemente holen ihre Ressourcen oft erst dann.

Häufige Fehler

Warum reicht es nicht, das Google-Fonts-Plugin zu deaktivieren?
Weil viele Themes und Plugins ihre Schriften direkt im Code laden, nicht über ein zentrales Plugin. Deaktivieren hilft nur gegen die Quelle, die du kennst.

Muss ich die Schriften trotzdem in der Datenschutzerklärung erwähnen?
Nur um klarzustellen, dass sie lokal ausgeliefert werden. Ein Abschnitt über Google Fonts als Datenempfänger entfällt — und wenn er noch drinsteht, ist deine Erklärung falsch.

Wird die Seite dadurch langsamer?
Nein, in der Regel schneller. Der Browser spart die DNS-Auflösung und den Verbindungsaufbau zu zwei fremden Hosts. Das sind je nach Verbindung 50 bis 200 Millisekunden.

Falls du nicht weiterkommst

Ich mache das beruflich. Schreib mir kurz, worum es geht — ich sag dir ehrlich, ob ich helfen kann.
Zu purin.at
← Alle Beiträge