Jak działa wtyczka Stats4U dla WordPressa: kod licznika, umiejscowienie, zgoda i żądania

Management Summary
Stats4U to licznik odwiedzin i usługa statystyczna dla witryn. Rozszerzenie WordPressa ułatwia wybór wyglądu licznika, umieszczenie go na stronie i połączenie z narzędziem do zgód. Przeglądarka wysyła informacje o odwiedzinach do zewnętrznej usługi, która tworzy statystyki. Artykuł wyjaśnia ten podział zadań oraz granice integracji. Licznik bez własnych ciasteczek nadal przesyła dane, a usunięcie rozszerzenia nie kasuje automatycznie statystyk u dostawcy.
Spis treści
Stats4U firmy LW IT Solutions wyświetla licznik odwiedzin jako mały obrazek. Przeglądarka wysyła żądania do stats4u.net; usługa zlicza i tworzy statystyki. Zależnie od integracji i ustawień mogą obejmować źródła wizyt, czas widoczności strony, głębokość przewinięcia i wskaźnik obecności online. Do osadzenia wystarcza numer licznika. Wtyczka WordPress jest dostępna w katalogu wtyczek; artykuł opisuje wersję 1.6.0. Kod znajduje się na GitHubie.
Artykuł wyjaśnia cztery zadania wtyczki: odczyt kodu licznika, umieszczenie obrazu w motywie, połączenie z narzędziem do zgód i załadowanie skryptu. Pierwotne testy przeprowadzono 2 października 2026 roku z WordPressem 7.1.2, PHP 8.4 i Twenty Twenty-Five. Zachowane raporty parsera, HTML i umiejscowienia porównano z kodem. Dawny test sieciowy celowo ograniczał ruch; nie potwierdza zachowania wszystkich odpowiedzi serwera ani każdego motywu.
Od kodu licznika do osadzenia
W „Ustawienia → Stats4U” kreator oferuje pięć kroków: licznik, wygląd, umiejscowienie, zgoda i zakończenie. Konfiguracja własna pokazuje zamiast tego wszystkie ustawienia na jednej stronie. Pierwsze pole przyjmuje istniejący kod licznika. Pozostałe możliwości otwierają generator lub zamawiają nowy numer. Żądania te wychodzą z przeglądarki osoby administrującej do usługi, a nie z kodu PHP wtyczki.
Parser stats4u_code_lesen() rozpoznaje kilka formatów kodu licznika obrazkowego. Zachowany test obejmuje dwanaście danych wejściowych; tabela łączy sam numer i numer z kratką w jednym wierszu. Skrypty globusa i mapy nie należą do obsługiwanych liczników obrazkowych. Przykłady nie dowodzą więc obsługi dowolnego kodu generatora:
| Wklejono | Wynik |
|---|---|
| HTML, obrazek z linkiem | numer, wzór, tryb ciemny i rozmiar 150% |
| BBCode | numer, wzór, tryb ciemny |
| Markdown | numer, wzór, język niemiecki |
kod skryptu z s4u.js | numer, wzór, tryb ciemny, liczenie „unikalnych odwiedzających”, język polski |
| sam adres obrazka | numer i wzór |
stara długa forma ?action=pic&s4uid=… | numer i wzór |
sam numer, także z # | numer, wzór bez zmian |
adres strony statystyk /live/<numer> | numer |
| strona statystyk z własną nazwą | wskazówka: wkleić kod albo numer |
widżet globusa globe.js | wskazówka: wtyczka pokazuje liczniki obrazkowe |
| dowolny inny tekst | wskazówka: kod nierozpoznany |
Od wersji 1.5.0 wtyczka wstawia oficjalny s4u.js zamiast samego obrazu. Skrypt odczytuje bieżący adres strony i document.referrer, a następnie przesyła te wartości z żądaniem obrazu. Ustawienia przeglądarki lub Referrer-Policy mogą usunąć albo skrócić adres odsyłający. Sam obraz również podlega tej polityce. Przy zwykłym ustawieniu domyślnym obcy serwer otrzymuje tylko początek adresu, na przykład https://example.com/; nie jest to jednak bezwarunkowa zasada ograniczenia do domeny. Poniższy fragment PHP wybiera skrypt ładowany od razu albo oczekujący element zastępczy:
// 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>';
}Bez wybranego narzędzia do zgód wp_get_script_tag() tworzy skrypt gotowy do natychmiastowego ładowania, z wartościami atrybutów bezpiecznie zapisanymi w HTML. Przy rozpoznanej integracji najpierw powstaje pusty element zastępczy. data-stats4u zawiera ustawienia licznika w formacie danych JSON. Samo wygenerowanie takiego HTML nie potwierdza jeszcze skutecznej blokady w przeglądarce.
Umiejscowienie w motywie
Domyślna pozycja znajduje się pod stopką motywu. WordPress nie udostępnia uniwersalnego punktu bezpośrednio za widocznym obszarem stopki. wp_footer to miejsce wywoływane przez motyw, zwykle przy końcu strony. Dla pozycji „pod” i „w” wtyczka najpierw zbiera HTML w buforze wyjścia i szuka rozpoznawalnej stopki. Poniższy fragment rozpoznaje określone role, klasy i identyfikatory; dowolny układ nie musi do nich pasować:
// 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;
}Spośród rozpoznanych obszarów wybrany zostaje ostatni najbardziej zewnętrzny. Gdy na przykład div.site-footer zawiera kolejny obszar stopki, uwzględniany jest cały zewnętrzny fragment. Zastępczo może posłużyć zwykły <footer> po wywołaniu get_footer(). Brak oznaczeń lub inne bufory wyjścia mogą przenieść licznik do ogólnej pozycji na końcu strony. Wersja 1.6.0 wstawia licznik przez funkcję zwrotną bufora. CSS z :has(img) ukrywa obsługiwane kontenery bez elementu obrazu; nie sprawdza, czy plik obrazu został poprawnie pobrany.
Zachowany raport potwierdza pozycje w testowanym motywie. „Pod treścią” działa raz w głównej treści pojedynczego wpisu lub strony. Statyczna strona główna również może spełnić ten warunek; dawna testowa strona główna bloga nie otrzymała tam licznika. Pozostałe opcje obejmują stały dolny narożnik i „nigdzie automatycznie”. Własne miejsce zapewniają blok „Stats4U counter” i shortcode . do_shortcode('') zwraca HTML, który szablon musi jeszcze wyświetlić. Dwa osadzenia mogą wysłać dwa żądania obrazu; nie gwarantują automatycznie jednego zliczenia.
Zgoda: wymagania i ograniczenia
Wersja 1.6.0 zawiera 27 pozycji: 25 narzędzi, dodatkowy starszy tryb CookieYes i WP Consent API. Dla każdego wyboru wtyczka generuje atrybuty blokujące lub sprawdzenie API. Oczekiwanie na zgodę wymaga prawidłowego narzędzia, kategorii lub identyfikatora usługi oraz kolejności wykonania. Tabela pokazuje zachowany wynik HTML; nie zastępuje pełnych testów akceptacji i odmowy dla każdej integracji.
| Narzędzie | Skrypt zwalniający w 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 | skrypt inline, który pyta wp_has_consent() i nasłuchuje zmian |
W zapisanych przypadkach HTML początkowo nie zawierał bezpośrednio ładowanego znacznika s4u.js. Niektóre integracje używają osobnego pliku freigabe.js. Dla WP Consent API kod wymaga ustawionego typu zgody i pozytywnego wyniku wp_has_consent(). W trybie opt-out wynik może być pozytywny jeszcze przed wyraźną zgodą. Konfiguracja API musi więc odpowiadać oczekiwanemu działaniu. Własne integracje dopuszczają tylko nazwy atrybutów type, class i data-*:
// 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;
}Test z onload="alert(1)" potwierdza usunięcie tego kodu obsługi zdarzenia. Dozwolone nazwy atrybutów nie chronią jednak przed każdą błędną konfiguracją: type="text/javascript" jest akceptowane i może uruchomić skrypt zwalniający natychmiast. Wersja 1.6.0 nie zatrzymuje też samodzielnie działających skryptów po wycofaniu zgody. Udostępniona już funkcja window.stats4uAn() nie sprawdza zgody przed kolejnymi wywołaniami. Odmowa, wycofanie zgody i późniejsze przejścia między stronami wymagają więc testu konkretnej integracji.
Dawny test sieciowy
Dawny raport opisuje Chrome ze świeżym profilem i przechwytywaniem żądań. Z usługi mógł zostać pobrany tylko s4u.js; pozostałe żądania zapisywano i przerywano. Pokazywało to próby wysłania danych, a nie odpowiedzi serwera ani rzeczywiste wyniki licznika. Test trwający 70 sekund nie obejmuje wszystkich możliwych żądań. Tabela przedstawia tę historyczną próbę; rozmiar pliku, kompresja i czas przechowywania w pamięci podręcznej mogą później ulec zmianie.
| Moment | Żądanie | Treść |
|---|---|---|
| przy ładowaniu | s4u.js | 13 237 bajtów przesłanych, Brotli, godzina w pamięci podręcznej, bez Set-Cookie |
| przy ładowaniu | action=cfg, GET | tylko numer licznika: ustawienia licznika |
| przy ładowaniu | action=pic, obrazek | numer licznika, wzór, tryb ciemny, język, adres strony, adres odsyłający i liczba losowa przeciw pamięci podręcznej; żądanie przeznaczone do zliczania; przerwane w opisanym teście |
| po 60 s | action=ping, POST | tylko numer licznika, dla „teraz online” |
| przy opuszczaniu | action=puls, beacon | numer licznika, adres strony, widoczne sekundy, głębokość przewinięcia i czas ładowania |
Obecny skrypt osadzenia nie ustawia własnych ciasteczek ani wpisów w localStorage. Dawny test z blokadą żądań sam w sobie nie potwierdzałby jednak zachowania wszystkich punktów usługi. Żądanie obrazu zawiera pełny bieżący URL i dostępny adres odsyłający; adresy stron nie powinny więc zawierać poufnych wartości. action=puls może zostać wysłane już przy pierwszym przejściu karty w tło, a nie dopiero przy ostatecznym opuszczeniu strony. Opcjonalne funkcje mogą dodać wymiary ekranu i okna, zdarzenia oraz dane wydajności. action=ping jest podejmowane co minutę przy widocznej stronie, dla najwyżej dziesięciu liczników i maksymalnie 120 wysłań. Pozytywny wynik sendBeacon() potwierdza tylko przyjęcie danych do kolejki wysyłania. Statystyki powstają na serwerze Stats4U. Kod PHP tej wtyczki nie zawiera własnego połączenia HTTP z usługą; nie jest to sprawdzenie pozostałych części instalacji WordPress.
Języki i przejścia między stronami
Przy ustawieniu „język każdej strony” wtyczka korzysta z ustawień regionalnych zgłoszonych przez WordPress. Zachowany test Polylang pokazuje en, de i pl dla odpowiednich stron. Przejście bez pełnego przeładowania wymaga dodatkowych kroków: s4u:seiteweg kończy poprzedni pomiar czasu, po czym trzeba ponownie osadzić licznik dla nowej strony. W tej witrynie inc/footer-tracker.php osobno sprawdza Consented.hasConsent('stats4u') przed ponownym wstawieniem skryptów lub aktywacją elementów zastępczych. Ta dodatkowa kontrola należy do witryny, a nie do publicznej funkcji wtyczki stats4uAn(). Odczyt kodu nie stanowi testu wszystkich przypadków wycofania zgody.
Publikacja i usuwanie wtyczki
Raport rozwojowy podaje uwagi WordPress.org z 26 września i zatwierdzenie z 29 września 2026 roku. Opublikowana lista zmian potwierdza poprawki bezpiecznego zapisu wartości w HTML i funkcji zwrotnej bufora w wersji 1.6.0. Chodzi o przygotowanie każdej wartości do konkretnego miejsca w HTML. Przegląd nie gwarantuje braku błędów. Dawniej dołączone tłumaczenia przeniesiono poza tę paczkę. Pakiety z translate.wordpress.org są dostępne dopiero po publikacji poszczególnych tłumaczeń; 18 dawnych wzorów nie oznacza automatycznie 18 gotowych pakietów.
Procedura usuwania kasuje stats4u_einstellungen i zapisany widok ustawień stats4u_ansicht. W Multisite przechodzi przez opcje poszczególnych witryn. Uruchamia się przy usuwaniu wtyczki, a nie samym wyłączeniu. Pamięć podręczna strony może nadal zawierać dawny HTML licznika. Usunięcie wtyczki nie usuwa zewnętrznego licznika ani statystyk.
Wszystkie linki
- Stats4U w katalogu wtyczek WordPress.org
- Kod źródłowy na GitHubie, z README i wzorami tłumaczeń
- Tłumaczenie na translate.wordpress.org
- stats4u.net, z kreatorem nowych liczników
- Akapit do polityki prywatności witryny, dla każdego numeru licznika i w 19 językach
- Warunki korzystania i polityka prywatności Stats4U
Pytania i odpowiedzi
Czy Stats4U ustawia ciasteczko?
Sprawdzony s4u.js nie ustawia ciasteczek ani nie zapisuje danych w localStorage dla samego osadzenia. Nie oznacza to, że cała witryna lub każde narzędzie do zgód działa bez ciasteczek. Niektóre adaptery wtyczki odczytują istniejące ciasteczka zgody. Generator i logowanie na stats4u.net również są czymś innym niż osadzony licznik. Dawny test blokował większość odpowiedzi serwera, więc nie był pełnym testem ciasteczek. Żądania nadal przesyłają między innymi adres IP i identyfikację przeglądarki. Podlinkowany wzór polityki prywatności musi odpowiadać rzeczywistym ustawieniom.
Co się dzieje, gdy stats4u.net jest niedostępne?
Awaria może uniemożliwić wyświetlenie obrazka licznika albo działanie części statystyk. async pozwala przeglądarce czytać HTML podczas pobierania skryptu, lecz pobieranie i wykonanie nadal wymagają czasu oraz zasobów. Reguła CSS ukrywa pusty kontener tylko bez elementu img. Jeśli element obrazu już istnieje, ale pobranie pliku się nie powiedzie, może pozostać widoczny uszkodzony obraz. Całkowicie niezmieniony wygląd strony nie jest więc gwarantowany.
Czy wizyty w podglądzie albo w edytorze są liczone?
Strona ustawień i edytor bloków używają rl=1 dla podglądu obrazka. W sprawdzonym kodzie usługi parametr ten wyłącza zwiększanie licznika. Samo żądanie obrazu nadal dociera na serwer ze zwykłymi danymi połączenia. Dotyczy to tych dwóch wbudowanych podglądów; zwykły podgląd wpisu w witrynie nie staje się automatycznie takim samym trybem.
Czy usunięcie wtyczki usuwa też licznik?
Usunięcie wtyczki kasuje własne ustawienia WordPress i preferencje widoku. Nie wysyła żądania usunięcia zewnętrznego licznika. Stara pamięć podręczna i osobno wstawiony kod wymagają osobnego uwzględnienia. Zarządzanie statystykami lub usunięcie danych na stats4u.net to odrębna czynność.
Źródła
- Stats4U 1.6.0 w katalogu wtyczek, dostęp 02.10.2026
- Stats4U-Wordpress, kod źródłowy na GitHubie, dostęp 02.10.2026
- WordPress.org: Detailed Plugin Guidelines, dostęp 02.10.2026
- WP Consent API, dostęp 02.10.2026
- wp_get_script_tag(), dostęp 02.10.2026
- wp_print_inline_script_tag(), dostęp 02.10.2026
- PHP: ob_start(), dostęp 02.10.2026
- MDN: Navigator.sendBeacon(), dostęp 02.10.2026
- MDN: :has(), dostęp 02.10.2026
- Stats4U: akapit do polityki prywatności, dostęp 02.10.2026
- MDN: Referrer-Policy, Dodatkowa kontrola 25.10.2026
- WP Consent API: wp_has_consent(), Dodatkowa kontrola 25.10.2026