LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Blog-Übersicht /WordPress-Plugins & Tricks / So funktioniert das WordPress-Plugin Stats4U: Zählercode, Platzierung,...
Diesen Artikel in anderen Sprachen lesen:

So funktioniert das WordPress-Plugin Stats4U: Zählercode, Platzierung, Einwilligung und Anfragen

So funktioniert das WordPress-Plugin Stats4U: Zählercode, Platzierung, Einwilligung und Anfragen

Management Summary

Stats4U ist ein Besucherzähler mit Statistikdienst für Websites. Die WordPress-Erweiterung erleichtert die Auswahl des Zählerbilds, dessen Platzierung und die Anbindung an ein Einwilligungswerkzeug. Der Browser sendet Besuchsinformationen an den externen Dienst, der daraus Statistiken erstellt. Der Artikel erklärt diese Aufgabenverteilung und die Grenzen der Einbindung. Ein Zähler ohne eigene Cookies überträgt weiterhin Daten; das Entfernen der Erweiterung löscht nicht automatisch die Statistik beim Dienst.

Inhalt
  1. Vom Zählercode zur Einbindung
  2. Platzierung im Theme
  3. Einwilligung: Voraussetzungen und Grenzen
  4. Historische Netzwerkprobe
  5. Sprachen und Seitenwechsel
  6. Veröffentlichung und Löschroutine
  7. Alle Links
  8. Fragen und Antworten
  9. Quellen

Stats4U von LW IT Solutions zeigt einen Besucherzähler als kleines Bild an. Der Browser sendet dazu Anfragen an stats4u.net; der Dienst zählt und erstellt die Statistik. Je Einbindung und Einstellung kommen Herkunft, sichtbare Zeit auf der Seite, Scrolltiefe und eine Online-Anzeige hinzu. Für das Einbetten genügt die Zählernummer. Das WordPress-Plugin ist im Plugin-Verzeichnis erhältlich; beschrieben wird Version 1.6.0. Der Quelltext liegt auf GitHub.

Der Beitrag erklärt vier Aufgaben des Plugins: Zählercode einlesen, ein Bild im Theme platzieren, ein Einwilligungswerkzeug anbinden und das Zählerskript laden. Die ursprünglichen Tests stammen vom 2. Oktober 2026 mit WordPress 7.1.2, PHP 8.4 und Twenty Twenty-Five. Erhaltene Parser-, HTML- und Platzierungsprotokolle wurden mit dem Code abgeglichen. Die damalige Netzwerkprobe war absichtlich eingeschränkt; Aussagen über alle Serverantworten oder sämtliche Themes lassen sich daraus nicht ableiten.

Vom Zählercode zur Einbindung

Unter „Einstellungen → Stats4U“ bietet ein Assistent fünf Schritte: Zähler, Aussehen, Platzierung, Einwilligung und Abschluss. Die eigene Konfiguration zeigt alternativ alle Einstellungen auf einer Seite. Das erste Feld nimmt vorhandenen Zählercode auf. Zwei weitere Möglichkeiten öffnen den Generator oder fordern eine neue Nummer an. Diese Anfragen gehen aus dem Browser der administrierenden Person an den Dienst, nicht aus dem PHP-Code des Plugins.

Der Parser stats4u_code_lesen() erkennt mehrere Formen des Bildzähler-Codes. Die erhaltene Prüfung enthält zwölf Eingaben; die Tabelle fasst Nummer und Nummer mit Raute in einer Zeile zusammen. Globus- und Karten-Skripte gehören nicht zu den unterstützten Bildzählern. Die Beispiele belegen daher keinen beliebigen Code des Generators:

EingefügtErgebnis
HTML, Bild mit LinkNummer, Entwurf, dunkler Modus und Größe 150 %
BBCodeNummer, Entwurf, dunkler Modus
MarkdownNummer, Entwurf, Sprache Deutsch
Skript-Code mit s4u.jsNummer, Entwurf, dunkler Modus, Zählweise „einmalige Besucher“, Sprache Polnisch
Bildadresse alleinNummer und Entwurf
alte Langform ?action=pic&s4uid=…Nummer und Entwurf
nur die Nummer, auch mit #Nummer, Entwurf bleibt
Adresse der Statistikseite /live/<Nummer>Nummer
Statistikseite mit eigenem NamenHinweis: Code oder Nummer einfügen
Globus-Widget globe.jsHinweis: das Plugin zeigt Bildzähler
beliebiger TextHinweis: Code nicht erkannt

Seit Version 1.5.0 setzt das Plugin das offizielle s4u.js statt nur eines Bildes ein. Das Skript liest die aktuelle Seitenadresse und document.referrer aus und sendet diese Werte mit der Bildanfrage. Der Referrer kann durch Browsereinstellungen oder Referrer-Policy fehlen oder gekürzt sein. Auch beim reinen Bild hängt der HTTP-Referrer von dieser Richtlinie ab; unter der üblichen Vorgabe erhält eine fremde Herkunft nur den Ursprung, beispielsweise https://example.com/. Eine universelle Beschränkung auf die Domain gibt es nicht. Der folgende PHP-Ausschnitt entscheidet zwischen sofortigem Skript und wartendem Platzhalter:

PHP
// stats4u.php (excerpt)
function stats4u_zaehler_teile($e) {
    $daten = stats4u_skript_daten($e);
    if (stats4u_cmp($e) === null) {
        return array('skript' => array('src' => STATS4U_SKRIPT, 'async' => true) + $daten);
    }
    stats4u_wartet(true);
    return array('platzhalter' => $daten);
}

function stats4u_html() {
    $e = stats4u_einstellungen();
    if ($e['id'] === '') { return ''; }
    $t = stats4u_zaehler_teile($e);
    if (isset($t['skript'])) {
        return '<span class="stats4u-zaehler">' . trim(wp_get_script_tag($t['skript'])) . '</span>';
    }
    return '<span class="stats4u-zaehler" data-stats4u="' . esc_attr(wp_json_encode($t['platzhalter'])) . '"></span>';
}

Ohne ausgewähltes Einwilligungswerkzeug erzeugt wp_get_script_tag() ein unmittelbar ladbares Skript mit maskierten Attributwerten. Mit einer erkannten Integration entsteht zunächst ein leerer Platzhalter. Das Attribut data-stats4u enthält dessen Zählereinstellungen im Datenformat JSON. Diese HTML-Vorbereitung allein beweist noch keine funktionierende Sperre im Browser.

Platzierung im Theme

Die Standardposition ist unter dem Theme-Seitenfuß. WordPress stellt dafür keinen universellen Haken direkt nach dem sichtbaren Fußbereich bereit. wp_footer ist ein vom Theme aufgerufener Ausgabepunkt, gewöhnlich nahe dem Seitenende. Das Plugin sammelt für die Positionen „unter“ und „im“ zunächst HTML in einem Ausgabepuffer und sucht darin nach einem erkennbaren Fußbereich. Der folgende Ausschnitt erkennt bestimmte Rollen, Klassen und IDs; nicht jedes beliebige Layout passt dazu:

PHP
// stats4u.php (excerpt)
function stats4u_ist_seitenfuss($name, $tag) {
    if (preg_match('/(?<![\w-])role\s*=\s*["\']?contentinfo\b/i', $tag)) { return true; }
    if (preg_match('/(?<![\w-])itemtype\s*=\s*["\']?[^"\'>]*WPFooter/i', $tag)) { return true; }
    $namen = array('colophon', 'footer', 'site-footer', 'main-footer', 'page-footer', 'global-footer',
                   'elementor-location-footer');
    if ($name === 'footer') { $namen[] = 'wp-block-template-part'; }
    foreach (array('id', 'class') as $attr) {
        if (preg_match('/(?<![\w-])' . $attr . '\s*=\s*(?:"([^"]*)"|\'([^\']*)\'|([^\s>]+))/i', $tag, $m)) {
            $wert = strtolower(($m[1] ?? '') . ($m[2] ?? '') . ($m[3] ?? ''));
            if (array_intersect(preg_split('/\s+/', trim($wert)), $namen)) { return true; }
        }
    }
    return false;
}

Bei mehreren erkannten Bereichen gewinnt der letzte äußere Bereich. Enthält etwa div.site-footer einen weiteren Fußbereich, wird der gesamte äußere Balken berücksichtigt. Als Rückfall kann ein einfaches <footer> nach dem Aufruf von get_footer() dienen. Fehlen passende Markierungen oder stören andere Ausgabepuffer, kann die Position zum allgemeinen Seitenende wechseln. Version 1.6.0 fügt den Zähler über den Rückruf des Puffers ein. Die CSS-Regel mit :has(img) versteckt unterstützte Zählercontainer ohne Bildelement; das ist keine Prüfung, ob die Bilddatei erfolgreich geladen wurde.

Das erhaltene Platzierungsprotokoll bestätigt die Positionen im getesteten Theme. „Unter dem Inhalt“ wirkt nur einmal im Hauptinhalt eines einzelnen Beitrags oder einer einzelnen Seite. Eine statische Startseite kann ebenfalls eine solche Seite sein; die damalige Blog-Startseite erhielt dort keinen Zähler. Weitere Optionen sind eine feste untere Ecke und „nirgends automatisch“. Für eigene Stellen stehen der Block „Stats4U counter“ und der Shortcode bereit. Ein Aufruf von do_shortcode('') liefert HTML zurück, das die Vorlage noch ausgeben muss. Zwei Einbindungen können zwei Bildanfragen auslösen; das ist nicht automatisch eine einzige Zählung.

Einwilligung: Voraussetzungen und Grenzen

Die Version 1.6.0 enthält 27 auswählbare Einträge: 25 Werkzeuge, zusätzlich den alten CookieYes-Modus und die WP Consent API. Das Plugin gibt je Auswahl Sperrattribute oder eine API-Abfrage aus. Damit das Laden tatsächlich auf Zustimmung wartet, müssen das zugehörige Werkzeug, die Kategorie beziehungsweise Dienstkennung und die Ausführungsreihenfolge richtig eingerichtet sein. Die folgende Tabelle zeigt erhaltene HTML-Ausgaben; diese Ausgabeprüfung ersetzt keinen vollständigen Zustimmungs- und Ablehnungstest jedes Werkzeugs.

WerkzeugFreigabeskript im HTML
Complianz<script type="text/plain" data-category="statistics">
Cookiebot<script type="text/plain" data-cookieconsent="statistics">
consented.eu<script type="text/plain" data-consented="stats4u">
CookieYes<script data-cookieyes="cookieyes-analytics" src="…/freigabe.js">
WP Consent APIInline-Skript, das wp_has_consent() fragt und auf Änderungen hört

In den protokollierten Fällen enthielt das HTML zunächst keine direkt ladende s4u.js-Einbindung. Einige Integrationen verwenden die externe Datei freigabe.js. Bei der WP Consent API verlangt der Plugin-Code einen gesetzten Einwilligungstyp und ein positives Ergebnis von wp_has_consent(). Im Opt-out-Modus kann dieses Ergebnis schon ohne ausdrückliche Zustimmung positiv sein. Die API-Einstellung muss daher zum gewünschten Verhalten passen. Für eigene Integrationen sind nur type, class und data-* als Attributnamen erlaubt:

PHP
// stats4u.php (excerpt)
function stats4u_eigene_attribute($roh) {
    $aus = array('type' => 'text/plain');
    if (preg_match_all('/([a-zA-Z][a-zA-Z0-9_.:-]*)\s*=\s*(?:"([^"]*)"|\'([^\']*)\'|([^\s"\'>]+))/', (string) $roh, $m, PREG_SET_ORDER)) {
        foreach ($m as $a) {
            $name = strtolower($a[1]);
            if (!preg_match('/^(data-[a-z0-9_.:-]+|class|type)$/', $name)) { continue; }
            $wert = $a[2] !== '' ? $a[2] : ((isset($a[3]) && $a[3] !== '') ? $a[3] : ($a[4] ?? ''));
            $aus[$name] = substr(preg_replace('/[^A-Za-z0-9 _.:\/,#-]/', '', $wert), 0, 80);
        }
    }
    return $aus;
}

Der Test mit onload="alert(1)" bestätigt, dass dieser Ereignis-Handler entfernt wird. Die erlaubten Attribute sind trotzdem kein Schutz vor jeder Fehlkonfiguration: type="text/javascript" wird akzeptiert und kann das Freigabeskript sofort ausführbar machen. Außerdem beendet die Version 1.6.0 bereits laufende Zählerskripte bei einem Widerruf nicht selbst. Die einmal bereitgestellte Funktion window.stats4uAn() prüft vor späteren Aufrufen keine Zustimmung erneut. Deshalb gehören Ablehnung, Widerruf und anschließende Seitenwechsel zur Prüfung der konkreten Integration.

WordPress liefert den Einbaucode. Der Browser sendet Anfragen, der Stats4U-Server zählt. Eine Sperre bis zur Einwilligung erfordert eine richtig eingerichtete Integration.
WordPress liefert den Einbaucode. Der Browser sendet Anfragen; der Stats4U-Server zählt. Die Einwilligungssperre hängt von der richtigen Integration ab.

Historische Netzwerkprobe

Der damalige Bericht beschreibt Chrome mit frischem Profil und angehaltenen Netzwerkanfragen. Nur s4u.js durfte vom Dienst geladen werden; weitere Anfragen wurden protokolliert und abgebrochen. Damit waren die versuchten Anfragen sichtbar, nicht deren Serverantworten oder tatsächliche Zählergebnisse. Die 70-Sekunden-Probe ist keine vollständige Liste aller möglichen Anfragen. Die folgende Tabelle beschreibt diese historische Probe; Dateigröße, Kompression und Cache-Dauer können sich später ändern.

ZeitpunktAnfrageInhalt
beim Ladens4u.js13.237 Bytes übertragen, mit Brotli, eine Stunde im Cache, kein Set-Cookie
beim Ladenaction=cfg, GETnur die Zählernummer: Einstellungen des Zählers
beim Ladenaction=pic, BildZählernummer, Entwurf, dunkler Modus, Sprache, Seitenadresse, Herkunft und eine Zufallszahl gegen Caches; für die Zählung vorgesehen; im beschriebenen Test abgebrochen
nach 60 saction=ping, POSTnur die Zählernummer, für „jetzt online“
beim Verlassenaction=puls, BeaconZählernummer, Seitenadresse, sichtbare Sekunden, Scrolltiefe und Ladezeit

Das aktuelle Skript verwendet für die Einbettung keine eigenen Cookies oder Einträge in localStorage. Die blockierte historische Probe allein könnte das Verhalten aller Dienst-Endpunkte jedoch nicht belegen. Zur Bildanfrage gehören die vollständige aktuelle URL und der verfügbare Referrer; vertrauliche Werte sollten deshalb nicht in Seitenadressen stehen. action=puls kann bereits beim ersten Wechsel in den Hintergrund gesendet werden, nicht erst beim endgültigen Verlassen. Optional können Bildschirm- und Fenstermaße, Ereignisse sowie zusätzliche Leistungsdaten hinzukommen. action=ping wird bei sichtbarer Seite im Minutentakt versucht, für bis zu zehn Zähler und höchstens 120 Sendungen. Ein erfolgreicher sendBeacon()-Rückgabewert bestätigt nur die Aufnahme in die Sende-Warteschlange. Die Statistik entsteht auf dem Stats4U-Server. Der PHP-Code dieses Plugins enthält keinen eigenen HTTP-Aufruf zum Dienst; andere Teile einer WordPress-Installation sind damit nicht geprüft.

Sprachen und Seitenwechsel

Bei „wie die Seite“ verwendet das Plugin das von WordPress gemeldete Gebietsschema. Die erhaltene Polylang-Probe zeigt en, de und pl für die jeweiligen Sprachseiten. Ein Wechsel ohne vollständiges Neuladen braucht zusätzliche Schritte: s4u:seiteweg beendet die alte Zeitmessung, anschließend muss die neue Seite erneut eingebunden werden. Auf dieser Website enthält inc/footer-tracker.php dafür eine eigene Prüfung von Consented.hasConsent('stats4u'), bevor vorhandene Skripte neu eingesetzt oder Platzhalter aktiviert werden. Diese zusätzliche Kontrolle stammt aus der Website und nicht aus der öffentlichen Plugin-Funktion stats4uAn(). Ein Test aller Widerrufsfälle folgt daraus noch nicht.

Veröffentlichung und Löschroutine

Der Entwicklungsbericht nennt eine Rückfrage von WordPress.org am 26. September und die Freigabe am 29. September 2026. Der veröffentlichte Änderungsverlauf bestätigt für Version 1.6.0 Änderungen an Ausgabemaskierung und Puffer-Rückruf. Maskieren bedeutet hier: Werte werden für ihren jeweiligen Platz im HTML sicher ausgegeben. Ein solcher Review ist keine Garantie für Fehlerfreiheit. Die früher mitgelieferten Übersetzungen wurden für dieses Paket ausgelagert. Sprachpakete über translate.wordpress.org sind nur verfügbar, sobald die jeweiligen Übersetzungen veröffentlicht sind; aus 18 früheren Vorlagen folgen nicht automatisch 18 fertige Sprachpakete.

Die Löschroutine entfernt stats4u_einstellungen und die gespeicherte Einstellungsansicht stats4u_ansicht. Bei Multisite werden die Optionen der einzelnen Websites durchlaufen. Diese Routine läuft beim Löschen des Plugins, nicht schon beim bloßen Deaktivieren. Ein vorhandener Seiten-Cache kann trotzdem noch altes Zähler-HTML enthalten. Der externe Zähler und seine Statistik werden durch die Plugin-Löschung nicht entfernt.

Alle Links

Fragen und Antworten

Setzt Stats4U ein Cookie?

Das geprüfte s4u.js setzt für die Einbettung selbst keine Cookies und schreibt nicht in localStorage. Das bedeutet nicht, dass die gesamte Website oder jedes Einwilligungswerkzeug ohne Cookies arbeitet. Einige Plugin-Adapter lesen vorhandene Einwilligungs-Cookies. Auch der Generator oder eine Anmeldung auf stats4u.net sind von der Einbettung zu unterscheiden. Die historische Probe blockierte die meisten Serverantworten und ist deshalb kein vollständiger Cookie-Test. Anfragen übertragen weiterhin unter anderem IP-Adresse und Browserkennung. Der verlinkte Datenschutz-Textbaustein muss zur tatsächlichen Konfiguration passen.

Was passiert, wenn stats4u.net nicht erreichbar ist?

Ein Ausfall kann das Zählerbild oder einzelne Statistikfunktionen verhindern. async erlaubt dem Browser, HTML während des Skript-Downloads weiter einzulesen; Laden und Ausführen kosten trotzdem Zeit und Ressourcen. Die CSS-Regel versteckt einen leeren Container nur ohne vorhandenes img. Ist bereits ein Bildelement eingesetzt, aber die Bildanfrage fehlgeschlagen, kann ein defektes Bild sichtbar bleiben. Eine völlig unveränderte Seitendarstellung ist daher nicht zugesichert.

Zählen Besuche in der Vorschau oder im Editor mit?

Die Einstellungen und der Block-Editor verwenden für die Bildvorschau rl=1. Im geprüften Dienst-Code unterdrückt dieser Parameter die Zählererhöhung. Die Bildanfrage selbst findet weiterhin statt und erreicht den Server mit üblichen Verbindungsdaten. Die Aussage gilt für diese beiden eingebauten Vorschauen; eine normale Frontend-Vorschau des Beitrags ist nicht automatisch derselbe Modus.

Löscht das Entfernen des Plugins auch den Zähler?

Die Plugin-Löschung entfernt die eigenen WordPress-Einstellungen und Ansichtspräferenzen. Eine externe Löschung des Zählers wird nicht aufgerufen. Alte Seiten-Caches und separat eingefügter Zählercode müssen gesondert berücksichtigt werden. Die Verwaltung oder Löschung der Statistik auf stats4u.net ist ein eigener Vorgang.

Quellen

Lukas Wojcik

Lukas Wojcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Kontakt

Eine Frage oder eine Idee für ein Webprojekt? Schreib mir kurz, worum es geht. Das Formular nutzt reCAPTCHA zum Schutz vor Spam.

Kommentar schreiben

Erfahrungen mit anderen Plugins oder Hosting-Umgebungen und Rückfragen zur Einrichtung sind hier willkommen.

Die E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind mit einem Stern versehen.