LW IT Solutions
« Blog Overview /WordPress-Plugins & Tricks / So funktioniert das WordPress-Plugin Stats4U: Zählercode, Platzierung,...
This post in other languages:

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

So funktioniert das WordPress-Plugin Stats4U: Zählercode, Platzierung, Einwilligung und Anfragen
Inhalt
  1. Vom eingefügten Code zum Zähler
  2. Hinter dem Seitenfuß jedes Themes
  3. Erst nach der Einwilligung
  4. Was der Browser an stats4u.net schickt
  5. Mehrsprachig und ohne Neuaufbau
  6. Durch das Review von WordPress.org
  7. Alle Links
  8. Fragen und Antworten
  9. Quellen

Stats4U ist ein Besucherzähler von LW IT Solutions: ein kleines Bild auf der Website, das Seitenaufrufe zählt, dazu eine Statistik auf stats4u.net mit Herkunft der Besucher, Verweildauer, Scrolltiefe und den Besuchern, die gerade online sind. Ein Konto braucht es nicht, die Zählernummer genügt. Für WordPress gibt es dazu ein eigenes Plugin. Es steht seit dem 29.09.2026 im Plugin-Verzeichnis von WordPress.org, in Version 1.6.0, und sein Quelltext liegt öffentlich auf GitHub.

Dieser Beitrag zeigt, wie das Plugin arbeitet: wie es einen eingefügten Zählercode liest, wie es den Zähler hinter den Seitenfuß eines beliebigen Themes setzt, wie es auf ein Einwilligungswerkzeug wartet und was der Browser danach an stats4u.net schickt. Alles ist auf einer lokalen Testinstallation mit WordPress 7.1.2, PHP 8.4 und Twenty Twenty-Five am 02.10.2026 nachgemessen, mit dem Plugin aus dem Verzeichnis. Am Ende stehen der Weg durch das Review von WordPress.org und alle Links.

Vom eingefügten Code zum Zähler

Unter „Einstellungen → Stats4U“ führt ein Assistent in fünf Schritten durch die Einrichtung: Zähler, Aussehen, Platzierung, Einwilligung, fertig. Wer alles auf einer Seite haben will, wählt stattdessen die eigene Konfiguration. Im ersten Schritt kommt der Code hinein, den der Generator auf stats4u.net ausgibt. Dafür gibt es drei Wege: ein vorhandener Code, ein Knopf, der den Generator öffnet und den Code am Ende zurückbringt, oder eine neue Zählernummer auf Anfrage. Die beiden letzten Wege laufen aus dem Browser der Administratorin oder des Administrators, nicht vom Server.

Der Generator kennt mehrere Formate, und das Plugin nimmt sie alle an. Die Tabelle zeigt, was stats4u_code_lesen() aus zwölf Eingaben gemacht hat:

Eingefügt Ergebnis
HTML, Bild mit Link Nummer, Entwurf, dunkler Modus und Größe 150 %
BBCode Nummer, Entwurf, dunkler Modus
Markdown Nummer, Entwurf, Sprache Deutsch
Skript-Code mit s4u.js Nummer, Entwurf, dunkler Modus, Zählweise „einmalige Besucher“, Sprache Polnisch
Bildadresse allein Nummer 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 Namen Hinweis: Code oder Nummer einfügen
Globus-Widget globe.js Hinweis: das Plugin zeigt Bildzähler
beliebiger Text Hinweis: Code nicht erkannt

Auf der Seite steht danach nicht mehr das Bild allein, sondern das offizielle Skript des Dienstes, dasselbe <script src="https://www.stats4u.net/s4u.js" data-id="…" async>, das der Generator ausgibt. Bis Version 1.4.0 setzte das Plugin nur das Bild. Das war leichter, aber ein Browser schickt mit einem Bild von einem fremden Server nur die Domain der Website mit, nicht die Seite und nicht die Herkunft des Besuchers. Erst das Skript liefert diese Angaben und dazu Verweildauer, Scrolltiefe und „jetzt online“. Welche Form am Platz des Zählers steht, entscheidet eine einzige Funktion:

// 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 Einwilligungswerkzeug ist das ein Skript-Tag, gebaut mit wp_get_script_tag(), das jedes Attribut maskiert. Mit einem Werkzeug ist es ein leerer Platzhalter, der die Angaben des Zählers als JSON trägt. Dazu später mehr.

Hinter dem Seitenfuß jedes Themes

Ab Werk erscheint der Zähler direkt unter dem Seitenfuß des Themes. Das klingt einfach, aber WordPress kennt keine Stelle „nach dem Fuß“. Der übliche Haken wp_footer liegt kurz vor </body>. Bis Version 1.3.0 hing der Zähler dort, und auf einer Seite, deren body als Flexbox angelegt ist, stand er dann als Spalte neben dem Inhalt, auf halber Höhe. Seit 1.3.1 puffert das Plugin die Ausgabe ab dem Ende von wp_head, sucht im Puffer den Seitenfuß und setzt den Zähler dahinter. Als Seitenfuß gilt ein Element, das sich als solcher ausweist:

// 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;
}

Unter mehreren Kandidaten gewinnt der letzte äußerste, damit der Zähler bei Themes, die ein <footer> in einen weiteren Fußbereich stecken, unter dem ganzen Balken steht. Fehlt ein erkennbarer Fuß, kommt der Zähler ans Ende der Seite. Bis das Skript das Bild gezeichnet hat, blendet eine CSS-Regel mit :has() den leeren Kasten aus, damit kein Rand als Lücke stehen bleibt. Seit Version 1.6.0 übernimmt diese Arbeit der Rückruf des Ausgabepuffers; das Plugin gibt die gepufferte Seite nicht mehr selbst aus. Diese Änderung kam aus dem Review von WordPress.org.

Auf der Testinstallation landete der Zähler bei jeder Einstellung an der beschriebenen Stelle. „Unter dem Fuß“ setzte ihn direkt hinter </footer>, „im Fuß“ davor, „am Ende der Seite“ vor die Skripte am Schluss. „Unter dem Inhalt“ setzte ihn nur auf Einzelseiten, nicht auf der Startseite. Die Ecken setzten ihn fest unten rechts oder links, und „nirgends automatisch“ ließ ihn weg. Für eigene Plätze gibt es den Block „Stats4U counter“ und den Shortcode , in einer Vorlage als do_shortcode( '' ). Block und Shortcode auf derselben Seite ergaben zwei Zähler, der Block mit seiner eigenen Ausrichtung.

Erst nach der Einwilligung

Wer ein Einwilligungswerkzeug nutzt, wählt es im vierten Schritt aus. Zur Wahl stehen 27 Einträge: 25 Werkzeuge, CookieYes zusätzlich im alten Modus und die WP Consent API, dazu jedes Werkzeug, das Skripte über eigene Attribute sperrt. Am Platz des Zählers steht dann ein leerer span mit den Angaben in data-stats4u. Am Ende der Seite steht ein kleines Freigabeskript, das das Werkzeug erst nach der Einwilligung ausführt und das dann in jeden Platzhalter das offizielle s4u.js setzt. Gemessen sah das so aus:

Werkzeug Freigabeskript 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 API Inline-Skript, das wp_has_consent() fragt und auf Änderungen hört

In keinem dieser Fälle stand s4u.js direkt im HTML. Für Werkzeuge, die nur Skripte mit eigener Adresse freigeben, wie CookieYes, bindet das Plugin die Datei freigabe.js ein. Bei der WP Consent API prüft das Skript zuerst, ob überhaupt ein Einwilligungstyp gesetzt ist, weil wp_has_consent() ohne Typ auch nach einer Ablehnung true liefert. Für ein Werkzeug, das nicht in der Liste steht, lassen sich eigene Attribute eintragen. Dabei kommen nur type, class und data-* durch:

// 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;
}

Ein eingetragenes onload="alert(1)" fehlte in der Ausgabe; übrig blieben type="text/plain" und data-category="statistics".

Vom eingefügten Code zum gezählten Besuch
Das Plugin Stats4U setzt das offizielle Zählerskript an die gewählte Stelle; gezählt wird im Browser, der WordPress-Server ruft stats4u.net nie auf

Was der Browser an stats4u.net schickt

Für diese Messung lief ein Chrome mit frischem Profil, in dem jede Anfrage angehalten wurde. Nur die Skriptdatei s4u.js selbst durfte geladen werden. Jede andere Anfrage an stats4u.net wurde mitgeschrieben und dann abgebrochen, damit keine Testzählung beim Dienst ankam. Die Seite blieb 70 Sekunden offen, danach wurde wegnavigiert.

Zeitpunkt Anfrage Inhalt
beim Laden s4u.js 13.237 Bytes übertragen, mit Brotli, eine Stunde im Cache, kein Set-Cookie
beim Laden action=cfg, GET nur die Zählernummer: Einstellungen des Zählers
beim Laden action=pic, Bild Zählernummer, Entwurf, dunkler Modus, Sprache, Seitenadresse, Herkunft und eine Zufallszahl gegen Caches; diese Anfrage zählt
nach 60 s action=ping, POST nur die Zählernummer, für „jetzt online“
beim Verlassen action=puls, Beacon Zählernummer, Seitenadresse, sichtbare Sekunden, Scrolltiefe und Ladezeit

Nach dem Laden standen im Browser keine Cookies und nichts im lokalen Speicher. Das Skript machte den Zähler zu einem Link auf seine Statistikseite, https://www.stats4u.net/live/<Nummer>. Diesen Link setzt der Dienst, nicht das Plugin; ein Zähler, der auf stats4u.net als nicht öffentlich eingestellt ist, verweist auf die Startseite des Dienstes. Der WordPress-Server selbst ruft stats4u.net nie auf: Im Code des Plugins steht kein einziger HTTP-Aufruf. Die Vorschau auf der Einstellungsseite und im Editor trägt den Parameter rl=1 und zählt nicht.

Mehrsprachig und ohne Neuaufbau

Steht die Sprache des Zählers auf „wie die Seite“, setzt das Plugin sie je Aufruf aus dem Gebietsschema. Mit Polylang trug der Zähler auf der englischen Startseite data-lang="en", auf der deutschen de und auf der polnischen pl. Themes, die Seiten ohne Neuaufbau wechseln, zählen ohne Hilfe nur die erste Seite. Für sie gibt es das Ereignis s4u:seiteweg, das die Verweildauer der alten Seite abschließt, und nach einer Einwilligung die Funktion window.stats4uAn(), die neue Platzhalter füllt. Diese Website nutzt genau diesen Weg. Auf ihr läuft Stats4U 1.6.0 mit consented.eu, und ihr Seitenwechsel ohne Neuaufbau löst vor jedem Tausch s4u:seiteweg aus.

Durch das Review von WordPress.org

Die erste Einreichung wurde am 26.09.2026 zurückgestellt. Das Review-Team verlangte, jeden Wert erst bei der Ausgabe zu maskieren, auch bei HTML, das eine Funktion zurückgibt, und keine Übersetzungsdateien im Paket mitzuliefern. Version 1.6.0 setzt das um. Jede Ausgabe läuft über esc_html(), esc_attr(), esc_url(), wp_kses() oder wp_print_script_tag(), und den Zähler hinter den Seitenfuß setzt der Rückruf des Ausgabepuffers. Die 18 Übersetzungen, die bis 1.5.0 im Paket lagen, liegen jetzt als Vorlage im GitHub-Repository; übersetzt wird auf translate.wordpress.org, und WordPress lädt die Sprachpakete von selbst. Am 29.09.2026 gab das Review-Team Stats4U frei.

Beim Löschen entfernt das Plugin seine Option und die gemerkte Ansicht der Einstellungsseite. Gemessen: Option mit 236 Bytes und Ansicht vorher vorhanden, danach beide weg. Der Zähler auf stats4u.net und seine Statistik bleiben bestehen.

Alle Links

Fragen und Antworten

Setzt Stats4U ein Cookie?

Nein. In der Messung mit frischem Browserprofil stand nach dem Laden kein Cookie im Browser und nichts im lokalen Speicher, und die Antwort mit s4u.js trug kein Set-Cookie. Wie bei jeder Anfrage an einen anderen Server gehen IP-Adresse und User-Agent des Browsers an stats4u.net. Einen Textvorschlag für die Datenschutzerklärung gibt es unter stats4u.net/privacy-embed.

Was passiert, wenn stats4u.net nicht erreichbar ist?

Dann fehlt der Zähler auf der Seite, sonst nichts. Das Skript lädt asynchron und hält die Seite nicht auf. Bis es ein Bild gezeichnet hat, blendet eine CSS-Regel den leeren Kasten aus, damit keine Lücke stehen bleibt.

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

Nein. Die Vorschau auf der Einstellungsseite und im Block-Editor lädt nur das Zählerbild mit dem Parameter rl=1, der „nur anzeigen“ bedeutet. Bis Version 1.1.0 zählte jeder Blick auf die Einstellungsseite als Besuch; das ist behoben.

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

Nein. Beim Löschen entfernt das Plugin seine Option und die gemerkte Ansicht der Einstellungsseite, sonst nichts. Der Zähler auf stats4u.net gehört dem Betreiber der Website und behält seine Statistik.

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.

Get in Touch

Briefly describe your project or inquiry for a tailored response. This site is protected by reCAPTCHA.

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.

ALL ARTICLES & CATEGORIES

CCTV

Diese Rubrik per RSS verfolgen

Cloud & AI

Diese Rubrik per RSS verfolgen

Data Privacy

Alle 18 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Digital Analytics

Alle 55 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Digital Marketing

Alle 37 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

IT & Networks

Alle 17 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Music Production

Alle 15 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Raspberry Pi

Diese Rubrik per RSS verfolgen

Smart Home

Alle 18 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

Web Entwicklung

Alle 11 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen

WordPress-Plugins & Tricks

Alle 11 Artikel dieser Rubrik Diese Rubrik per RSS verfolgen