{"id":13516,"date":"2026-09-02T09:48:28","date_gmt":"2026-09-02T07:48:28","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/wordpress-site-health-analyzer\/"},"modified":"2026-09-02T09:48:28","modified_gmt":"2026-09-02T07:48:28","slug":"wordpress-site-health-analyzer","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/","title":{"rendered":"WordPress Site Health Analyzer"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Wystarczy jeden adres. Serwer pobiera stron\u0119 g\u0142\u00f3wn\u0105, wybiera do trzech podstron (produkt, kategori\u0119, wpis) i wykonuje kilka sond: robots.txt, xmlrpc.php, list\u0119 u\u017cytkownik\u00f3w REST, ?author=1, readme.html, katalog uploads, przekierowanie z http oraz po jednym pliku CSS i JS. Na tej podstawie powstaje lista tego, co strona WordPress lub WooCommerce mog\u0142aby robi\u0107 lepiej \u2013 z punktami i w kolejno\u015bci wagi. Raport jest przechowywany przez 24 godziny; po zmianach na stronie przycisk pod raportem uruchamia sprawdzenie ponownie i pokazuje r\u00f3\u017cnic\u0119.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"wh-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adres strony WordPress<\/label><br \/>\n        <input id=\"wh-url\" type=\"text\" value=\"https:\/\/example.com\/\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Z tego serwera na podany adres trafia do czternastu \u017c\u0105da\u0144, jako zwyk\u0142y GET bez ciasteczek. \u017b\u0105dania do sieci prywatnych, adres\u00f3w loopback i link-local s\u0105 odrzucane, tak\u017ce przez przekierowania. Zapytanie chroni reCAPTCHA v3; adres IP wywo\u0142uj\u0105cego i cel s\u0105 przechowywane przez godzin\u0119 w celu ograniczenia cz\u0119stotliwo\u015bci (sze\u015b\u0107 \u015bwie\u017cych przebieg\u00f3w na godzin\u0119). Sam raport, zawieraj\u0105cy wy\u0142\u0105cznie publiczne fakty o stronie, jest przechowywany przez 24 godziny pod skr\u00f3tem adresu.<\/p>\n<p>    <button id=\"wh-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Analizuj stron\u0119<\/button><\/p>\n<div id=\"wh-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Granica, o kt\u00f3rej warto wiedzie\u0107: odczytywany jest dostarczony HTML i nag\u0142\u00f3wki, nic nie jest wykonywane. Obrazy wstawiane p\u00f3\u017aniej przez skrypt, tagi \u0142adowane po zgodzie i wszystko, co przegl\u0105darka mierzy w trakcie dzia\u0142ania (Largest Contentful Paint, przesuni\u0119cia uk\u0142adu), pozostaje niewidoczne. Raport wskazuje, gdzie patrze\u0107 \u2013 nie m\u00f3wi, jak szybka strona jest w odczuciu.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Wystarczy jeden adres. Serwer pobiera stron\u0119 g\u0142\u00f3wn\u0105, wybiera do trzech podstron (produkt, kategori\u0119, wpis) i wykonuje kilka sond: robots.txt, xmlrpc.php, list\u0119 u\u017cytkownik\u00f3w REST, ?author=1, readme.html, katalog uploads, przekierowanie z http oraz po jednym pliku CSS i JS. Na tej podstawie powstaje lista tego, co strona WordPress lub WooCommerce mog\u0142aby robi\u0107 lepiej \u2013 z punktami i w kolejno\u015bci wagi. Raport jest przechowywany przez 24 godziny; po zmianach na stronie przycisk pod raportem uruchamia sprawdzenie ponownie i pokazuje r\u00f3\u017cnic\u0119.\",\"label_url\":\"Adres strony WordPress\",\"datenschutz\":\"Z tego serwera na podany adres trafia do czternastu \u017c\u0105da\u0144, jako zwyk\u0142y GET bez ciasteczek. \u017b\u0105dania do sieci prywatnych, adres\u00f3w loopback i link-local s\u0105 odrzucane, tak\u017ce przez przekierowania. Zapytanie chroni reCAPTCHA v3; adres IP wywo\u0142uj\u0105cego i cel s\u0105 przechowywane przez godzin\u0119 w celu ograniczenia cz\u0119stotliwo\u015bci (sze\u015b\u0107 \u015bwie\u017cych przebieg\u00f3w na godzin\u0119). Sam raport, zawieraj\u0105cy wy\u0142\u0105cznie publiczne fakty o stronie, jest przechowywany przez 24 godziny pod skr\u00f3tem adresu.\",\"knopf\":\"Analizuj stron\u0119\",\"knopf_erneut\":\"Zmiany wprowadzone, sprawd\u017a ponownie\",\"laeuft\":\"Pobieranie strony g\u0142\u00f3wnej, podstron i sond...\",\"laeuft_lang\":\"Wci\u0105\u017c trwa. Wolna strona potrzebuje do minuty, poniewa\u017c na ka\u017cd\u0105 stron\u0119 trzeba poczeka\u0107.\",\"grenze\":\"Granica, o kt\u00f3rej warto wiedzie\u0107: odczytywany jest dostarczony HTML i nag\u0142\u00f3wki, nic nie jest wykonywane. Obrazy wstawiane p\u00f3\u017aniej przez skrypt, tagi \u0142adowane po zgodzie i wszystko, co przegl\u0105darka mierzy w trakcie dzia\u0142ania (Largest Contentful Paint, przesuni\u0119cia uk\u0142adu), pozostaje niewidoczne. Raport wskazuje, gdzie patrze\u0107 \u2013 nie m\u00f3wi, jak szybka strona jest w odczuciu.\",\"h_uebersicht\":\"Przegl\u0105d\",\"zeile_endziel\":\"Adres docelowy\",\"zeile_wordpress\":\"WordPress\",\"zeile_woocommerce\":\"WooCommerce\",\"zeile_theme\":\"Motyw\",\"zeile_plugins\":\"Wtyczki widoczne w HTML\",\"zeile_server\":\"Serwer\",\"zeile_http\":\"Protok\u00f3\u0142\",\"zeile_seiten\":\"Sprawdzone strony\",\"zeile_limit\":\"Pozosta\u0142e \u015bwie\u017ce przebiegi w tej godzinie\",\"punkte_label\":\"na 100\",\"aus_cache_hinweis\":\"Ten raport ma {alter} i pochodzi z pami\u0119ci. Przycisk poni\u017cej uruchamia \u015bwie\u017ce sprawdzenie.\",\"frisch_hinweis\":\"\u015awie\u017cy raport, przygotowany w {sekunden} s.\",\"vorher_hinweis\":\"Poprzedni przebieg: {vorher} pkt. Teraz: {jetzt} ({diff}).\",\"budget_hinweis\":\"Pomini\u0119to {n} podstron(y), poniewa\u017c bud\u017cet czasu si\u0119 wyczerpa\u0142. Strona odpowiada wolno; raport opiera si\u0119 na mniejszej liczbie stron ni\u017c zwykle.\",\"bereich_leistung\":\"Dostarczanie\",\"bereich_assets\":\"Skrypty i style\",\"bereich_bilder\":\"Obrazy\",\"bereich_dokument\":\"Dokument\",\"bereich_woocommerce\":\"WooCommerce\",\"bereich_hygiene\":\"Higiena\",\"h_befunde\":\"Ustalenia\",\"stufe_hoch\":\"Wysoka\",\"stufe_mittel\":\"\u015arednia\",\"stufe_niedrig\":\"Niska\",\"stufe_info\":\"Informacja\",\"stufe_gut\":\"W porz\u0105dku\",\"keine_befunde\":\"Brak uwag.\",\"h_seiten\":\"Strony\",\"spalte_seite\":\"Strona\",\"spalte_typ\":\"Rodzaj\",\"spalte_ttfb\":\"Czas do pierwszego bajtu\",\"spalte_groesse\":\"HTML\",\"spalte_skripte\":\"Skrypty (blokuj\u0105ce)\",\"spalte_bilder\":\"Obrazy\",\"spalte_cache\":\"Cache\",\"typ_start\":\"strona g\u0142\u00f3wna\",\"typ_seite\":\"strona\",\"typ_beitrag\":\"wpis\",\"typ_produkt\":\"produkt\",\"typ_shop\":\"sklep \\\/ kategoria\",\"typ_warenkorb\":\"koszyk\",\"typ_kasse\":\"kasa\",\"typ_konto\":\"konto\",\"typ_archiv\":\"archiwum\",\"h_sonden\":\"Sondy\",\"sonde_http\":\"Przekierowanie z http:\\\/\\\/\",\"sonde_robots\":\"robots.txt\",\"sonde_xmlrpc\":\"xmlrpc.php\",\"sonde_rest_users\":\"Lista u\u017cytkownik\u00f3w REST\",\"sonde_author\":\"?author=1\",\"sonde_readme\":\"readme.html\",\"sonde_uploads\":\"Katalog uploads\",\"sonde_css\":\"Jeden plik CSS\",\"sonde_js\":\"Jeden plik JS\",\"sonde_budget\":\"pomini\u0119ta (bud\u017cet czasu)\",\"sonde_fehler\":\"nieosi\u0105galna\",\"einheit_minuten\":\"min\",\"einheit_stunden\":\"godz.\",\"ja\":\"tak\",\"nein\":\"nie\",\"wert_keine\":\"brak widocznych\",\"fehler_kein_token\":\"Sprawdzenie nie mog\u0142o si\u0119 rozpocz\u0105\u0107, poniewa\u017c reCAPTCHA si\u0119 nie za\u0142adowa\u0142a.\",\"fehler_captcha\":\"reCAPTCHA uzna\u0142a \u017c\u0105danie za zautomatyzowane. Zwykle pomaga ponowne za\u0142adowanie strony.\",\"fehler_zu_viele\":\"Osi\u0105gni\u0119to limit {limit} \u015bwie\u017cych przebieg\u00f3w na godzin\u0119 dla tego adresu. Zapisane raporty s\u0105 nadal wy\u015bwietlane.\",\"fehler_adresse\":\"Tego adresu nie da si\u0119 u\u017cy\u0107.\",\"fehler_zaehler\":\"Licznik jest niedost\u0119pny, dlatego nic nie zosta\u0142o pobrane.\",\"fehler_pruefdienst\":\"Us\u0142uga reCAPTCHA by\u0142a nieosi\u0105galna.\",\"fehler_aufbau\":\"Us\u0142uga nie jest poprawnie skonfigurowana. B\u0142\u0105d le\u017cy po tej stronie.\",\"fehler_eingabe\":\"\u017b\u0105danie by\u0142o nieczytelne.\",\"fehler_methode\":\"Niew\u0142a\u015bciwa metoda \u017c\u0105dania.\",\"fehler_netz\":\"Us\u0142uga by\u0142a nieosi\u0105galna.\",\"fehler_antwort\":\"Odpowied\u017a by\u0142a nieczytelna.\",\"fehler_abruf\":\"Adresu nie uda\u0142o si\u0119 pobra\u0107.\",\"fehler_status\":\"Strona g\u0142\u00f3wna odpowiedzia\u0142a statusem {status} zamiast 200. Nic nie zosta\u0142o przeanalizowane.\",\"fehler_kein_html\":\"Adres zwraca co\u015b innego ni\u017c HTML.\",\"fehler_unbekannt\":\"Co\u015b posz\u0142o nie tak, a nie ma na to osobnego komunikatu.\",\"grund_leer\":\"Nic nie zosta\u0142o wpisane.\",\"grund_zu_lang\":\"Adres jest za d\u0142ugi.\",\"grund_unlesbar\":\"To nie jest czytelny adres internetowy.\",\"grund_schema\":\"Pobierane s\u0105 tylko http i https.\",\"grund_benutzerinfo\":\"Adresy z danymi logowania s\u0105 odrzucane.\",\"grund_kein_punkt\":\"Nazwa hosta potrzebuje co najmniej jednej kropki.\",\"grund_hostform\":\"Nazwa hosta ma nieu\u017cyteczn\u0105 form\u0119.\",\"grund_port\":\"Pobierane s\u0105 tylko porty 80, 443, 8080 i 8443.\",\"grund_gesperrter_bereich\":\"Ten adres wskazuje na sie\u0107 prywatn\u0105 lub zarezerwowan\u0105. Takie adresy nigdy nie s\u0105 pobierane, tak\u017ce przez przekierowanie.\",\"grund_kein_dns\":\"Nazwy hosta nie da si\u0119 rozwi\u0105za\u0107.\",\"grund_zu_viele_spruenge\":\"Za du\u017co przekierowa\u0144.\",\"grund_abruf\":\"Serwer nie odpowiedzia\u0142 na czas albo zamkn\u0105\u0142 po\u0142\u0105czenie.\",\"befund_wp_nicht_erkannt\":\"Nie wykryto WordPressa || W HTML nie ma ani \\\/wp-content\\\/, ani \\\/wp-includes\\\/, ani znacznika generator WordPressa. Og\u00f3lne sprawdzenia nadal obowi\u0105zuj\u0105; sondy specyficzne dla WordPressa s\u0105 pomijane.\",\"befund_wc_erkannt\":\"Wykryto WooCommerce || Obowi\u0105zuj\u0105 poni\u017csze sprawdzenia sklepowe: fragmenty koszyka, skrypty kasy, style blok\u00f3w i buforowanie stron poza koszykiem i kas\u0105.\",\"befund_ttfb_langsam\":\"Wolna odpowied\u017a serwera: mediana {ms} ms do pierwszego bajtu (najgorzej {max} ms) || Powy\u017cej 600 ms ka\u017cda strona startuje p\u00f3\u017ano, zanim za\u0142aduje si\u0119 pierwszy zas\u00f3b. Cache stron serwuj\u0105cy gotowy HTML zwykle sprowadza to poni\u017cej 200 ms; PHP 8.x, cache obiekt\u00f3w i mniej zapyta\u0144 do bazy na stron\u0119 pomagaj\u0105 tam, gdzie cache nie mo\u017ce zadzia\u0142a\u0107.\",\"befund_ttfb_maessig\":\"Umiarkowana odpowied\u017a serwera: mediana {ms} ms do pierwszego bajtu (najgorzej {max} ms) || Poni\u017cej 300 ms to cel dla strony z cache. Do sprawdzenia: czy cache rzeczywi\u015bcie trafia na tych stronach i czy jaka\u015b wtyczka wykonuje zapytania przy ka\u017cdym \u017c\u0105daniu.\",\"befund_ttfb_gut\":\"Szybka odpowied\u017a serwera: mediana {ms} ms do pierwszego bajtu || Strona serwera nie jest w\u0105skim gard\u0142em.\",\"befund_kein_seitencache\":\"Nie wykryto cache stron || \u017badna ze sprawdzonych stron nie mia\u0142a nag\u0142\u00f3wka cache (X-Cache, Age, CF-Cache-Status, X-LiteSpeed-Cache) ani \u015bladu wtyczki buforuj\u0105cej. Ka\u017cda wizyta jest renderowana przez PHP. Cache stron (LiteSpeed Cache, WP Rocket, WP Super Cache, Cache Enabler albo cache hostingu) to najwi\u0119kszy pojedynczy zysk dla bloga i sklepu.\",\"befund_seitencache_teilweise\":\"Cache stron ({name}) na {n} z {von} stron nadaj\u0105cych si\u0119 do buforowania || Cz\u0119\u015b\u0107 stron omija cache. Typowe przyczyny: ciasteczko ustawiane przy pierwszej wizycie, wtyczka oznaczaj\u0105ca strony jako niebuforowalne albo parametry zapytania tworz\u0105ce nowe klucze cache.\",\"befund_seitencache_erkannt\":\"Cache stron dzia\u0142a ({name}) || Na sprawdzonych stronach gotowy HTML jest serwowany bez PHP.\",\"befund_html_nicht_komprimiert\":\"HTML jest dostarczany bez kompresji || W odpowiedzi nie ma ani gzip, ani Brotli. W\u0142\u0105czenie kompresji na serwerze WWW (mod_deflate, mod_brotli, gzip w nginx) zmniejsza transfer HTML o 70\u201380 procent bez dotykania WordPressa.\",\"befund_html_teils_komprimiert\":\"{n} stron(y) dostarczono bez kompresji || Kompresja jest skonfigurowana tylko dla cz\u0119\u015bci odpowiedzi, cz\u0119sto dlatego, \u017ce cache serwuje zapisane pliki bez regu\u0142y kodowania.\",\"befund_html_komprimiert\":\"HTML jest skompresowany ({art}) || Rozmiar transferu jest redukowany na serwerze.\",\"befund_http1\":\"Tylko HTTP\\\/1.1 || Serwer nie negocjuje HTTP\\\/2. Przy dziesi\u0105tkach skrypt\u00f3w, styl\u00f3w i obraz\u00f3w na stron\u0119 multipleksowanie HTTP\\\/2 wyra\u017anie skraca \u0142adowanie; na Apache to mod_http2 z Protocols h2, na nginx flaga http2 w linii listen.\",\"befund_http2\":\"HTTP\\\/2 dzia\u0142a || \u017b\u0105dania wsp\u00f3\u0142dziel\u0105 jedno po\u0142\u0105czenie.\",\"befund_http3\":\"HTTP\\\/3 oferowany || Serwer og\u0142asza h3 przez Alt-Svc; obs\u0142uguj\u0105ce przegl\u0105darki przechodz\u0105 na QUIC.\",\"befund_html_no_store\":\"HTML oznaczony jako niebuforowalny ({wert}) || Cache-Control z no-store lub private uniemo\u017cliwia ka\u017cdemu CDN i proxy zachowanie strony. Dla anonimowych odwiedzaj\u0105cych bloga lub sklepu rzadko jest to zamierzone.\",\"befund_cookies_erste_antwort\":\"Ciasteczka ju\u017c w pierwszej anonimowej odpowiedzi ({namen}) || Ciasteczka sesyjne i testowe na ka\u017cdej stronie sprawiaj\u0105, \u017ce wi\u0119kszo\u015b\u0107 cache stron pomija odpowied\u017a, a ka\u017cda wizyta staje si\u0119 spersonalizowana. Typowe przyczyny: sesja PHP uruchamiana przez wtyczk\u0119 albo ciasteczka sesji WooCommerce poza koszykiem i kas\u0105.\",\"befund_blockierende_skripte\":\"{n} skrypt\u00f3w blokuj\u0105cych renderowanie w sekcji head || Skrypty bez defer lub async w head zatrzymuj\u0105 parser do czasu pobrania i wykonania. Przeniesione do stopki albo z atrybutem defer pozwalaj\u0105 stronie najpierw si\u0119 wyrenderowa\u0107; lista wskazuje pliki.\",\"befund_blockierende_skripte_wenige\":\"{n} skrypt(y) blokuj\u0105ce renderowanie w sekcji head || Niewiele, ale wci\u0105\u017c warto doda\u0107 defer, o ile skrypt nie musi dzia\u0142a\u0107 przed body.\",\"befund_viele_skripte\":\"{n} zewn\u0119trznych skrypt\u00f3w na stronie g\u0142\u00f3wnej || Ponad 25 plik\u00f3w skrypt\u00f3w zwykle oznacza, \u017ce kilka wtyczek \u0142aduje swoje zasoby na ka\u017cdej stronie. Regu\u0142a dequeue dla ka\u017cdego typu strony albo wtyczka optymalizuj\u0105ca zasoby zmniejsza liczb\u0119 \u017c\u0105da\u0144 i czas wykonania.\",\"befund_viele_stylesheets\":\"{n} arkuszy styl\u00f3w || Ka\u017cdy arkusz to blokuj\u0105ce \u017c\u0105danie. Scalenie tego, co nale\u017cy do motywu, i usuni\u0119cie styl\u00f3w wtyczek ze stron, kt\u00f3re ich nie potrzebuj\u0105, skraca \u015bcie\u017ck\u0119 krytyczn\u0105.\",\"befund_jquery_migrate\":\"\u0141adowany jest jQuery Migrate || Warstwa zgodno\u015bci istnieje tylko dla starych wtyczek. Je\u015bli po usuni\u0119ciu konsola przegl\u0105darki niczego nie zg\u0142asza, da si\u0119 j\u0105 usun\u0105\u0107 przez dequeue.\",\"befund_wp_emoji\":\"\u0141adowany jest skrypt emoji || WordPress dodaje wp-emoji i DNS prefetch do s.w.org na ka\u017cdej stronie. Nowoczesne przegl\u0105darki renderuj\u0105 emoji natywnie; skrypt usuwaj\u0105 dwa wywo\u0142ania remove_action.\",\"befund_wp_embed\":\"\u0141adowany jest skrypt wp-embed || Potrzebny tylko do osadzania wpis\u00f3w z innych stron WordPress. Do usuni\u0119cia, je\u015bli strona z tego nie korzysta.\",\"befund_wp_polyfill\":\"wp-polyfill \u0142adowany na froncie || Polyfill istnieje dla starych przegl\u0105darek i zwykle jest doci\u0105gany przez skrypt bloku lub wtyczki, kt\u00f3ry na froncie nie jest potrzebny.\",\"befund_dashicons\":\"Dashicons \u0142adowane dla odwiedzaj\u0105cych || Czcionka ikon panelu administracyjnego jest do\u0142\u0105czana na froncie, zwykle przez wtyczk\u0119. Anonimowi odwiedzaj\u0105cy jej nie potrzebuj\u0105; dequeue, chyba \u017ce motyw u\u017cywa tych ikon.\",\"befund_block_library_css\":\"CSS biblioteki blok\u00f3w bez tre\u015bci blokowych || Style wp-block-library s\u0105 \u0142adowane, cho\u0107 w HTML nie ma klas blok\u00f3w. Klasyczne motywy mog\u0105 je usun\u0105\u0107 przez dequeue.\",\"befund_global_styles_gross\":\"Wbudowany CSS global styles o rozmiarze {kb} KB || Wynik theme.json trafia inline na ka\u017cd\u0105 stron\u0119. Du\u017ca warto\u015b\u0107 oznacza wiele nieu\u017cywanych ustawie\u0144; skr\u00f3cenie theme.json lub usuni\u0119cie nieu\u017cywanych wariant\u00f3w pomaga.\",\"befund_inline_css_gross\":\"{kb} KB CSS inline || Style inline powtarzaj\u0105 si\u0119 na ka\u017cdej stronie i nigdy nie trafiaj\u0105 do cache przegl\u0105darki. Zwyk\u0142ym \u017ar\u00f3d\u0142em s\u0105 kreatory stron; powtarzaj\u0105ce si\u0119 regu\u0142y nale\u017c\u0105 do arkusza styl\u00f3w.\",\"befund_google_fonts_extern\":\"Czcionki \u0142adowane z fonts.googleapis.com || Po\u0142\u0105czenie z podmiotem trzecim, zanim tekst mo\u017ce si\u0119 wyrenderowa\u0107, a w UE kwestia ochrony danych. W\u0142asne pliki WOFF2 z font-display: swap s\u0105 szybsze i unikaj\u0105 transferu.\",\"befund_fontawesome_cdn\":\"Font Awesome z CDN || Pe\u0142na czcionka ikon dla kilku ikon, z obcego hosta. Inline SVG lub podzbi\u00f3r z w\u0142asnej domeny jest mniejszy.\",\"befund_fremde_hosts\":\"{n} obcych host\u00f3w dla skrypt\u00f3w i styl\u00f3w || Ka\u017cdy host kosztuje zapytanie DNS i u\u015bcisk d\u0142oni TLS przed pierwszym bajtem. Lista je wskazuje; konsolidacja lub w\u0142asny hosting usuwa po\u0142\u0105czenia.\",\"befund_kein_preconnect\":\"Brak preconnect dla obcych host\u00f3w || Link preconnect dla host\u00f3w potrzebnych wcze\u015bnie (czcionki, tag manager) nawi\u0105zuje po\u0142\u0105czenie, zanim przegl\u0105darka odkryje zas\u00f3b.\",\"befund_admin_ajax_frontend\":\"admin-ajax.php u\u017cywany na froncie || Ka\u017cde wywo\u0142anie \u0142aduje ca\u0142y bootstrap panelu. Dla danych publicznych REST API jest l\u017cejsze i buforowalne.\",\"befund_inline_js_gross\":\"{kb} KB JavaScriptu inline || Skrypty inline s\u0105 parsowane od nowa na ka\u017cdej stronie i nie trafiaj\u0105 do cache. Przeniesienie do pliku z defer pomaga.\",\"befund_assets_ohne_cache\":\"Pliki statyczne bez buforowania w przegl\u0105darce ({art}) || Sprawdzony plik nie ma u\u017cytecznego max-age ani Expires. Powracaj\u0105cy odwiedzaj\u0105cy pobieraj\u0105 ka\u017cdy skrypt i arkusz ponownie; miesi\u0105c dla wersjonowanych zasob\u00f3w to zwyk\u0142e ustawienie (mod_expires albo expires w nginx).\",\"befund_assets_kurz_gecacht\":\"Pliki statyczne buforowane tylko {tage} dzie\u0144\\\/dni ({art}) || Wersjonowane zasoby mog\u0105 le\u017ce\u0107 w cache miesi\u0105cami; parametr ?ver zmienia si\u0119, gdy zmienia si\u0119 plik.\",\"befund_assets_gecacht\":\"Pliki statyczne buforowane przez {tage} dni ({art}) || Powracaj\u0105cy odwiedzaj\u0105cy ponownie u\u017cywaj\u0105 skrypt\u00f3w i styl\u00f3w.\",\"befund_assets_nicht_komprimiert\":\"Pliki statyczne dostarczane bez kompresji ({art}) || Zasoby tekstowe bez gzip lub Brotli. To samo ustawienie serwera, kt\u00f3re kompresuje HTML, powinno obejmowa\u0107 CSS i JavaScript.\",\"befund_bilder_ohne_masse\":\"{n} z {von} obraz\u00f3w bez width i height || Bez wymiar\u00f3w przegl\u0105darka nie mo\u017ce zarezerwowa\u0107 miejsca i uk\u0142ad skacze, gdy obraz dociera (Cumulative Layout Shift). WordPress dodaje atrybuty obrazom wstawionym przez edytor; motywy i kreatory cz\u0119sto je pomijaj\u0105.\",\"befund_bilder_ohne_lazy\":\"{n} z {von} obraz\u00f3w poni\u017cej pierwszego ekranu bez loading=\\u0022lazy\\u0022 || Obrazy poza pierwszym ekranem mog\u0105 poczeka\u0107. WordPress ustawia atrybut domy\u015blnie; motyw lub wtyczka z w\u0142asnymi tagami img go pomija.\",\"befund_bilder_altformat\":\"Brak nowoczesnych format\u00f3w obraz\u00f3w (sprawdzono {von} obraz\u00f3w) || Nigdzie nie ma WebP ani AVIF. Od WordPressa 6.5 przesy\u0142ane pliki da si\u0119 konwertowa\u0107 automatycznie; to samo robi wtyczka obraz\u00f3w lub hosting. Oszcz\u0119dno\u015b\u0107 30\u201360 procent na obraz jest typowa.\",\"befund_bilder_modern\":\"Nowoczesne formaty obraz\u00f3w w u\u017cyciu ({n} z {von}) || WebP lub AVIF s\u0105 serwowane dla cz\u0119\u015bci obraz\u00f3w.\",\"befund_bilder_ohne_srcset\":\"{n} z {von} obraz\u00f3w bez srcset || Bez \u017ar\u00f3de\u0142 responsywnych ka\u017cde urz\u0105dzenie pobiera ten sam plik. WordPress generuje rozmiary przy przesy\u0142aniu; motyw musi je wypisa\u0107.\",\"befund_erstes_bild_lazy\":\"Pierwszy obraz jest \u0142adowany leniwie || Obraz na pierwszym ekranie jest op\u00f3\u017aniany przez atrybut, kt\u00f3ry mia\u0142 go chroni\u0107. Powinien by\u0107 \u0142adowany od razu, najlepiej z fetchpriority=\\u0022high\\u0022.\",\"befund_iframes_ohne_lazy\":\"{n} iframe bez loading=\\u0022lazy\\u0022 || Osadzone filmy i mapy \u0142aduj\u0105 po ca\u0142ej stronie ka\u017cdy. Leniwe \u0142adowanie odk\u0142ada je do chwili przewini\u0119cia w pole widzenia.\",\"befund_kein_fetchpriority\":\"Brak fetchpriority na obrazie g\u0142\u00f3wnym || Oznaczenie najwi\u0119kszego widocznego obrazu przez fetchpriority=\\u0022high\\u0022 przesuwa go przed skrypty i poprawia Largest Contentful Paint.\",\"befund_html_gross\":\"Dokument HTML o rozmiarze {kb} KB || Du\u017ce dokumenty zwykle nios\u0105 CSS inline, SVG inline lub znaczniki kreatora. Powy\u017cej 300 KB sam parser zajmuje na telefonie zauwa\u017calny czas.\",\"befund_dom_gross\":\"Oko\u0142o {n} w\u0119z\u0142\u00f3w DOM || Ponad 2500 w\u0119z\u0142\u00f3w spowalnia obliczanie styl\u00f3w i uk\u0142adu. Zwyk\u0142ym \u017ar\u00f3d\u0142em s\u0105 kreatory stron i zagnie\u017cd\u017cone kontenery.\",\"befund_viewport_fehlt\":\"Brak znacznika meta viewport || Bez niego telefony renderuj\u0105 stron\u0119 w szeroko\u015bci pulpitu i j\u0105 pomniejszaj\u0105. Ka\u017cdy motyw powinien ustawia\u0107 width=device-width.\",\"befund_lang_fehlt\":\"Brak atrybutu lang na elemencie html || Czytniki ekranu i wyszukiwarki nie rozpoznaj\u0105 j\u0119zyka; WordPress ustawia go z j\u0119zyka witryny, o ile motyw nie nadpisuje tagu html.\",\"befund_titel_fehlt\":\"Brak tytu\u0142u || Dokument nie ma elementu title.\",\"befund_beschreibung_fehlt\":\"Brak meta description || Nie jest czynnikiem rankingowym, ale to fragment pokazywany przez wyszukiwarki. Wtyczka SEO uzupe\u0142nia go dla ka\u017cdej strony.\",\"befund_kein_canonical\":\"Brak linku canonical || Bez niego duplikaty (z parametrami, z uko\u015bnikiem ko\u0144cowym i bez) konkuruj\u0105 ze sob\u0105. Yoast, Rank Math i rdze\u0144 od 6.x go dodaj\u0105; tutaj co\u015b go usun\u0119\u0142o.\",\"befund_noindex\":\"Strona ustawiona na noindex || Strona g\u0142\u00f3wna ka\u017ce wyszukiwarkom jej nie indeksowa\u0107. Zamierzone na stagingu, powa\u017cny b\u0142\u0105d na stronie produkcyjnej.\",\"befund_kopf_ballast\":\"Balast w head: link RSD, wlwmanifest lub shortlink || Pozosta\u0142o\u015bci po narz\u0119dziach zdalnego publikowania. Nieszkodliwe, ale ka\u017cdy to element link i wskaz\u00f3wka o platformie; wywo\u0142ania remove_action je usuwaj\u0105.\",\"befund_pingback_offen\":\"Og\u0142oszony punkt ko\u0144cowy pingback || Nag\u0142\u00f3wek X-Pingback lub link wskazuje na xmlrpc.php. Pingbacki s\u0142u\u017c\u0105 spamowi i atakom wzmacniaj\u0105cym; wy\u0142\u0105czenie XML-RPC usuwa jedno i drugie.\",\"befund_wc_fragments_ueberall\":\"Fragmenty koszyka \u0142adowane na {n} stronie\\\/stronach poza koszykiem || wc-cart-fragments wysy\u0142a \u017c\u0105danie admin-ajax przy ka\u017cdym za\u0142adowaniu strony, aby od\u015bwie\u017cy\u0107 mini-koszyk, i omija przy tym cache stron. Do usuni\u0119cia przez dequeue poza koszykiem i kas\u0105 albo przez ustawienie motywu.\",\"befund_wc_fragments_ok\":\"Fragmenty koszyka tylko tam, gdzie s\u0105 potrzebne || Brak skryptu cart-fragments na stronach bloga i tre\u015bci.\",\"befund_wc_checkout_skripte_ueberall\":\"Skrypty kasy na {n} stronie\\\/stronach poza kas\u0105 || Skrypty kasy i adresu s\u0105 ci\u0119\u017ckie i potrzebne na jednej stronie. Warunkowy dequeue je tam zatrzymuje.\",\"befund_wc_produktskripte_ueberall\":\"Skrypty strony produktu na {n} stronie\\\/stronach nieb\u0119d\u0105cych produktami || Skrypty galerii, powi\u0119kszenia i wariant\u00f3w \u0142adowane poza stronami produkt\u00f3w.\",\"befund_wc_blocks_css_ueberall\":\"Style blok\u00f3w WooCommerce na {n} stronie\\\/stronach tre\u015bci || CSS wc-blocks jest \u0142adowany na stronach bez blok\u00f3w sklepowych. Do usuni\u0119cia przez dequeue poza stronami sklepu.\",\"befund_wc_layout_css_ueberall\":\"Style uk\u0142adu WooCommerce na {n} wpisie\\\/wpisach bloga || Arkusze sklepu s\u0105 \u0142adowane na wpisach bez znacznik\u00f3w sklepu.\",\"befund_wc_nicht_gecacht\":\"{n} stron(y) sklepu oznaczone jako niebuforowalne || Cache-Control zabrania buforowania na stronach, kt\u00f3re nie s\u0105 koszykiem, kas\u0105 ani kontem. Zwykle zbyt wcze\u015bnie uruchomiona sesja; do sprawdzenia, kt\u00f3ra wtyczka ustawia nag\u0142\u00f3wek.\",\"befund_wc_select2_ueberall\":\"select2 \\\/ selectWoo \u0142adowane poza kas\u0105 i kontem || Biblioteka list rozwijanych jest potrzebna tylko na formularzach.\",\"befund_wc_passwortmesser\":\"Miernik si\u0142y has\u0142a \u0142adowany na froncie || zxcvbn wa\u017cy oko\u0142o 800 KB i nale\u017cy wy\u0142\u0105cznie do formularza rejestracji.\",\"befund_wc_keine_shopseite_geprueft\":\"W\u015br\u00f3d link\u00f3w wewn\u0119trznych nie znaleziono strony produktu ani kategorii || Sprawdzenia sklepowe przebieg\u0142y na dost\u0119pnych stronach. Bezpo\u015brednie wpisanie adresu sklepu daje pe\u0142niejszy obraz.\",\"befund_generator_version\":\"Wersja WordPressa {version} w znaczniku generator || Dok\u0142adna wersja jest publiczna. Sama w sobie nie jest podatno\u015bci\u0105, ale przestarza\u0142\u0105 instalacj\u0119 \u0142atwo tak znale\u017a\u0107; do usuni\u0119cia znacznik generator, a rdze\u0144 do aktualizowania.\",\"befund_generator_meta\":\"Obecny znacznik meta generator || Platforma jest og\u0142aszana w head. Do usuni\u0119cia jednowierszowym filtrem.\",\"befund_x_powered_by\":\"Nag\u0142\u00f3wek X-Powered-By: {wert} || Serwer og\u0142asza sw\u00f3j stos. Do usuni\u0119cia przez expose_php = Off i regu\u0142\u0119 nag\u0142\u00f3wka.\",\"befund_php_alt\":\"W u\u017cyciu PHP {version} || Poni\u017cej 8.1 interpreter jest bez wsparcia bezpiecze\u0144stwa i wyra\u017anie wolniejszy. WordPress i WooCommerce dzia\u0142aj\u0105 na 8.2 i 8.3; prze\u0142\u0105czenie zwykle oferuje panel hostingu.\",\"befund_server_version\":\"Nag\u0142\u00f3wek Server z wersj\u0105: {wert} || Dok\u0142adna wersja serwera WWW jest publiczna. ServerTokens Prod na Apache, server_tokens off na nginx.\",\"befund_kein_hsts\":\"Brak Strict-Transport-Security || Po przekierowaniu na https HSTS utrzymuje przegl\u0105darki na https i oszcz\u0119dza przy kolejnych wizytach pierwsze nieszyfrowane \u017c\u0105danie.\",\"befund_https_redirect_ok\":\"http przekierowuje na https ({status}) || Adres nieszyfrowany prowadzi do bezpiecznego.\",\"befund_kein_https_redirect\":\"http odpowiada 200 zamiast przekierowa\u0107 || Strona jest osi\u0105galna bez szyfrowania, a wyszukiwarki mog\u0105 zaindeksowa\u0107 obie wersje. Sta\u0142e przekierowanie na https nale\u017cy do konfiguracji serwera WWW.\",\"befund_http_redirect_nicht_https\":\"http przekierowuje, ale nie na https ({ort}) || Cel przekierowania to zn\u00f3w adres nieszyfrowany; \u0142a\u0144cuch powinien ko\u0144czy\u0107 si\u0119 na https.\",\"befund_xmlrpc_offen\":\"xmlrpc.php jest aktywny || Punkt ko\u0144cowy XML-RPC przyjmuje \u017c\u0105dania. To ulubiona droga atak\u00f3w brute force i nadu\u017cy\u0107 pingback, potrzebna tylko aplikacji mobilnej i Jetpackowi. Do zablokowania na serwerze WWW lub wy\u0142\u0105czenia filtrem.\",\"befund_xmlrpc_gesperrt\":\"xmlrpc.php jest zablokowany ({status}) || Punkt ko\u0144cowy odrzuca \u017c\u0105dania.\",\"befund_rest_users_offen\":\"Lista u\u017cytkownik\u00f3w czytelna przez REST ({n} kont(a): {liste}) || \\\/wp-json\\\/wp\\\/v2\\\/users zwraca ka\u017cdemu loginy autor\u00f3w. To pierwszy krok ataku na has\u0142o; punkt ko\u0144cowy nale\u017cy ograniczy\u0107 do zalogowanych.\",\"befund_rest_users_gesperrt\":\"Lista u\u017cytkownik\u00f3w REST niepubliczna ({status}) || Punkt ko\u0144cowy nie ujawnia kont.\",\"befund_author_enum\":\"?author=1 zdradza login ({name}) || Przekierowanie na archiwum autora ujawnia pierwsze konto. Regu\u0142a przekierowania lub ustawienie wtyczki to powstrzymuje.\",\"befund_readme_offen\":\"readme.html jest publiczny || Plik podaje wersj\u0119 WordPressa. Do usuni\u0119cia po ka\u017cdej aktualizacji albo do zablokowania na serwerze WWW.\",\"befund_uploads_listing\":\"Katalog uploads wy\u015bwietla swoj\u0105 zawarto\u015b\u0107 || \\\/wp-content\\\/uploads\\\/ zwraca listing katalogu. Options -Indexes na Apache albo autoindex off na nginx.\",\"befund_robots_fehlt\":\"Brak robots.txt || WordPress generuje go dynamicznie, o ile nie zapobiega temu fizyczny plik lub regu\u0142a rewrite. Brak pliku nie jest b\u0142\u0119dem, ale wiersz Sitemap warto mie\u0107.\",\"befund_robots_ohne_sitemap\":\"robots.txt bez wiersza Sitemap || Wiersz Sitemap: z adresem mapy XML pomaga robotom znale\u017a\u0107 ka\u017cd\u0105 stron\u0119.\",\"befund_robots_sperrt_assets\":\"robots.txt blokuje \\\/wp-content\\\/ lub \\\/wp-includes\\\/ || Google renderuje strony i potrzebuje CSS oraz JavaScriptu. Blokowanie tych katalog\u00f3w pogarsza rozumienie strony.\",\"befund_robots_sperrt_alles\":\"robots.txt blokuje wszystko || Disallow: \\\/ nie wpuszcza \u017cadnego robota. Zamierzone tylko na stagingu.\",\"befund_wp_version_gelesen\":\"WordPress {version} || Odczytane ze znacznika generator lub z parametr\u00f3w wersji zasob\u00f3w.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-wphealth.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var BEREICHE = ['leistung', 'assets', 'bilder', 'dokument', 'woocommerce', 'hygiene'];<\/p>\n<p>    \/\/ =========================================================================\n    \/\/ Bewertung - rein\n    \/\/ =========================================================================<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }<\/p>\n<p>    \/** Platzhalter {x} aus den Befunddaten einsetzen. *\/\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_]+)\\}\/g, function (m, k) {\n            if (daten && daten[k] !== undefined && daten[k] !== null) {\n                return Array.isArray(daten[k]) ? daten[k].join(', ') : String(daten[k]);\n            }\n            return m;\n        });\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) {\n            return { fehler: a.fehler, grund: a.grund || null, status: zahl(a.status), limit: zahl(a.limit), kette: liste(a.kette) };\n        }\n        var p = (a.punkte && typeof a.punkte === 'object') ? a.punkte : {};\n        var bereiche = [];\n        BEREICHE.forEach(function (b) {\n            if (p.bereiche && zahl(p.bereiche[b]) !== null) { bereiche.push({ name: b, punkte: p.bereiche[b] }); }\n        });\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe,\n                     punkte: zahl(f.punkte) || 0, bereich: f.bereich || '', daten: (f.daten && typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var gesamt = zahl(p.gesamt);\n        var farbe = gesamt === null ? 'grau' : (gesamt >= 85 ? 'gut' : (gesamt >= 60 ? 'mittel' : 'schlecht'));\n        var vorher = (a.vorher && zahl(a.vorher.punkte) !== null) ? { punkte: a.vorher.punkte, erstellt: a.vorher.erstellt || null } : null;\n        return {\n            fehler: null,\n            url: a.url || '', endziel: a.endziel || a.url || '',\n            wordpress: !!a.wordpress, wpVersion: a.wp_version || null,\n            woocommerce: !!a.woocommerce, wcVersion: a.wc_version || null,\n            theme: a.theme || null, plugins: liste(a.plugins),\n            server: (a.server && typeof a.server === 'object') ? a.server : {},\n            seiten: liste(a.seiten),\n            sonden: (a.sonden && typeof a.sonden === 'object') ? a.sonden : {},\n            gesamt: gesamt, farbe: farbe, bereiche: bereiche,\n            befunde: befunde, gruppen: gruppen,\n            ausCache: !!a.aus_cache, alterS: zahl(a.alter_s) || 0,\n            erstellt: a.erstellt || null, dauer: zahl(a.dauer_ms),\n            limitRest: zahl(a.limit_rest), vorher: vorher,\n            uebersprungen: zahl(a.unterseiten_uebersprungen) || 0\n        };\n    }<\/p>\n<p>    \/\/ =========================================================================\n    \/\/ Abruf\n    \/\/ =========================================================================<\/p>\n<p>    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); };\n            s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    \/** grecaptcha.ready abwarten - execute ist bei onload noch nicht da. *\/\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'wphealth' })\n                            .then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url, erneut) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, {\n                method: 'POST', headers: { 'Content-Type': 'application\/json' },\n                body: JSON.stringify({ url: url, token: token || '', erneut: !!erneut })\n            }).then(function (r) {\n                return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; });\n            }, function () { return { fehler: 'netz' }; });\n        });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.WH = { bewerten: bewerten, darstellen: null, text: text, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, BEREICHE: BEREICHE, T: T };<\/p>\n<p>    \/\/ =========================================================================\n    \/\/ Oberflaeche\n    \/\/ =========================================================================<\/p>\n<p>    var btn = document.getElementById('wh-btn');\n    var out = document.getElementById('wh-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) {\n        var e = document.createElement(tag);\n        if (stil) { e.setAttribute('style', stil); }\n        if (txt !== undefined && txt !== null) { e.textContent = txt; }\n        return e;\n    }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }<\/p>\n<p>    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;';\n    var WARN = ' color: #ffa94d;';\n    var ROT = ' color: #ff7b72;';\n    var GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var PUNKTFARBE = { gut: '#7ee787', mittel: '#ffa94d', schlecht: '#ff7b72', grau: '#8a8a99' };<\/p>\n<p>    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) {\n        g.appendChild(el('div', ZELLE, n));\n        g.appendChild(el('div', ZELLE_WERT + (stil || ''), w));\n    }\n    function balken(ziel, beschriftung, punkte, breite) {\n        var z = el('div', 'display: grid; grid-template-columns: 160px 1fr 44px; gap: 10px; align-items: center; margin: 4px 0;');\n        z.appendChild(el('div', ZELLE + ' padding: 0;', beschriftung));\n        var hg = el('div', 'height: 10px; border-radius: 5px; background: var(--border, #2a2a35); overflow: hidden;');\n        var f = punkte >= 85 ? PUNKTFARBE.gut : (punkte >= 60 ? PUNKTFARBE.mittel : PUNKTFARBE.schlecht);\n        hg.appendChild(el('div', 'height: 100%; width: ' + Math.max(2, Math.min(100, punkte)) + '%; background: ' + f + '; border-radius: 5px;'));\n        z.appendChild(hg);\n        z.appendChild(el('div', ZELLE_WERT + ' padding: 0; text-align: right;', String(punkte)));\n        ziel.appendChild(z);\n    }\n    function dauerText(s) {\n        if (s < 3600) { return Math.max(1, Math.round(s \/ 60)) + ' ' + T.einheit_minuten; }\n        return Math.round(s \/ 3600) + ' ' + T.einheit_stunden;\n    }\n\n    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund &#038;&#038; T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            if (b.status !== null) { txt = txt.replace('{status}', String(b.status)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n\n        \/\/ --- Kopf: Punkte und Herkunft ---\n        var kopf = el('div', KASTEN + ' display: flex; flex-wrap: wrap; gap: 18px 28px; align-items: center;');\n        var pk = el('div', 'text-align: center; min-width: 110px;');\n        pk.appendChild(el('div', 'font-family: \"Nunito Sans\", sans-serif; font-weight: 800; font-size: 2.6rem; line-height: 1; color: ' + PUNKTFARBE[b.farbe] + ';', b.gesamt === null ? '-' : String(b.gesamt)));\n        pk.appendChild(el('div', ZELLE + ' padding: 4px 0 0; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.5px;', T.punkte_label));\n        kopf.appendChild(pk);\n        var bb = el('div', 'flex: 1 1 320px;');\n        b.bereiche.forEach(function (x) { balken(bb, T['bereich_' + x.name] || x.name, x.punkte); });\n        kopf.appendChild(bb);\n        ziel.appendChild(kopf);\n\n        var hinweise = el('div', 'margin: 0 0 6px;');\n        if (b.ausCache) {\n            hinweise.appendChild(el('p', ZELLE + GRAU + ' margin: 0 0 6px;', text('aus_cache_hinweis', { alter: dauerText(b.alterS) })));\n        } else if (b.dauer !== null) {\n            hinweise.appendChild(el('p', ZELLE + GRAU + ' margin: 0 0 6px;', text('frisch_hinweis', { sekunden: (b.dauer \/ 1000).toFixed(1) })));\n        }\n        if (b.vorher &#038;&#038; b.gesamt !== null) {\n            var diff = b.gesamt - b.vorher.punkte;\n            var stil = diff > 0 ? GUT : (diff < 0 ? ROT : GRAU);\n            hinweise.appendChild(el('p', ZELLE + stil + ' margin: 0 0 6px; font-weight: 700;',\n                text('vorher_hinweis', { vorher: b.vorher.punkte, jetzt: b.gesamt, diff: (diff > 0 ? '+' : '') + diff })));\n        }\n        if (b.uebersprungen > 0) { hinweise.appendChild(el('p', ZELLE + WARN + ' margin: 0 0 6px;', text('budget_hinweis', { n: b.uebersprungen }))); }\n        ziel.appendChild(hinweise);<\/p>\n<p>        \/\/ --- Erneut pruefen ---\n        var erneutBtn = el('button', 'background: transparent; color: var(--accent, #7ee787); border: 1px solid var(--accent, #7ee787); padding: 9px 16px; border-radius: 6px; font-weight: 700; cursor: pointer; font-size: 0.85rem; margin: 4px 0 10px;', T.knopf_erneut);\n        erneutBtn.className = 'button wh-erneut';\n        erneutBtn.setAttribute('data-url', b.url);\n        ziel.appendChild(erneutBtn);<\/p>\n<p>        \/\/ --- Uebersicht ---\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_uebersicht));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_endziel, b.endziel);\n        paar(g, T.zeile_wordpress, b.wordpress ? (b.wpVersion ? T.ja + ' (' + b.wpVersion + ')' : T.ja) : T.nein, b.wordpress ? GUT : WARN);\n        if (b.woocommerce) { paar(g, T.zeile_woocommerce, b.wcVersion ? T.ja + ' (' + b.wcVersion + ')' : T.ja, GUT); }\n        if (b.theme) { paar(g, T.zeile_theme, b.theme); }\n        paar(g, T.zeile_plugins, b.plugins.length ? b.plugins.join(', ') : T.wert_keine, GRAU);\n        if (b.server.software) { paar(g, T.zeile_server, b.server.software + (b.server.x_powered_by ? ' \/ ' + b.server.x_powered_by : ''), GRAU); }\n        if (b.server.http) { paar(g, T.zeile_http, 'HTTP\/' + b.server.http + (b.server.kompression ? ', ' + b.server.kompression : ''), GRAU); }\n        paar(g, T.zeile_seiten, String(b.seiten.length), GRAU);\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);<\/p>\n<p>        \/\/ --- Befunde ---\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var titel = text('befund_' + f.key, f.daten) || f.key;\n                var teile = titel.split(' || ');\n                var z1 = el('div', 'display: flex; justify-content: space-between; gap: 12px; align-items: baseline;');\n                z1.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (f.punkte > 0) { z1.appendChild(el('div', ZELLE_WERT + ' padding: 0; white-space: nowrap;' + GRAU, '-' + f.punkte)); }\n                k.appendChild(z1);\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                if (Array.isArray(f.daten.liste) && f.daten.liste.length) {\n                    var l = el('ul', 'margin: 8px 0 0 18px; padding: 0; color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; font-family: monospace; word-break: break-all;');\n                    f.daten.liste.forEach(function (x) { l.appendChild(el('li', '', String(x))); });\n                    k.appendChild(l);\n                }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }<\/p>\n<p>        \/\/ --- Seiten ---\n        if (b.seiten.length) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_seiten));\n            var tabelle = el('div', 'overflow-x: auto;');\n            var gs = gitter('minmax(160px, 2fr) auto auto auto auto auto auto');\n            [T.spalte_seite, T.spalte_typ, T.spalte_ttfb, T.spalte_groesse, T.spalte_skripte, T.spalte_bilder, T.spalte_cache].forEach(function (s) {\n                gs.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s));\n            });\n            b.seiten.forEach(function (s) {\n                gs.appendChild(el('div', ZELLE_WERT, s.url));\n                gs.appendChild(el('div', ZELLE, T['typ_' + s.typ] || s.typ));\n                var t = zahl(s.ttfb_ms);\n                gs.appendChild(el('div', ZELLE_WERT + (t === null ? '' : (t >= 600 ? ROT : (t >= 300 ? WARN : GUT))), t === null ? '-' : t + ' ms'));\n                gs.appendChild(el('div', ZELLE_WERT, s.kb + ' KB'));\n                gs.appendChild(el('div', ZELLE_WERT, s.skripte + (s.blockierend ? ' (' + s.blockierend + ')' : '')));\n                gs.appendChild(el('div', ZELLE_WERT, String(s.bilder)));\n                var c = s.cache && s.cache.erkannt;\n                gs.appendChild(el('div', ZELLE + (c ? GUT : WARN), c ? (s.cache.name || T.ja) : T.nein));\n            });\n            tabelle.appendChild(gs);\n            ziel.appendChild(tabelle);\n        }<\/p>\n<p>        \/\/ --- Sonden ---\n        var so = b.sonden;\n        if (so.gelaufen) {\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_sonden));\n            var gso = gitter('auto auto');\n            Object.keys(so.gelaufen).forEach(function (n) {\n                var lauf = so.gelaufen[n];\n                var w = '';\n                if (lauf !== 'ok') { w = lauf === 'budget' ? T.sonde_budget : T.sonde_fehler; }\n                else if (n === 'http' && so.http) { w = so.http.status + (so.http.ort ? ' \u2192 ' + so.http.ort : ''); }\n                else if (n === 'author' && so.author) { w = so.author.status + (so.author.ort ? ' \u2192 ' + so.author.ort : ''); }\n                else if ((n === 'css' || n === 'js') && so[n]) { w = so[n].status + (so[n].cache_control ? ' \u00b7 ' + so[n].cache_control : '') + (so[n].kompression ? ' \u00b7 ' + so[n].kompression : ''); }\n                else { w = String(so[n] === null || so[n] === undefined ? '-' : so[n]); }\n                paar(gso, T['sonde_' + n] || n, w, GRAU);\n            });\n            ziel.appendChild(gso);\n        }\n    }\n    window.LW_TEST.WH.darstellen = darstellen;<\/p>\n<p>    var laeuft = false;\n    function lauf(url, erneut) {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        var spaet = setTimeout(function () {\n            var p = out.querySelector('p');\n            if (p && laeuft) { p.textContent = T.laeuft_lang; }\n        }, 12000);\n        abfragen(url, erneut).then(function (a) {\n            clearTimeout(spaet);\n            darstellen(bewerten(a), out); laeuft = false; btn.disabled = false;\n        }, function () {\n            clearTimeout(spaet);\n            darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false;\n        });\n    }\n    btn.addEventListener('click', function () { lauf(wert('wh-url'), false); });\n    out.addEventListener('click', function (ev) {\n        var t = ev.target;\n        if (t && t.classList && t.classList.contains('wh-erneut')) {\n            ev.preventDefault();\n            lauf(t.getAttribute('data-url') || wert('wh-url'), true);\n        }\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wystarczy jeden adres: raport ocenia blog WordPress lub sklep WooCommerce pod k\u0105tem cache stron, kompresji, HTTP\/2, skrypt\u00f3w blokuj\u0105cych renderowanie, \u0142adowania obraz\u00f3w, fragment\u00f3w koszyka na ka\u017cdej stronie, wyciek\u00f3w wersji i otwartego XML-RPC \u2013 z punktacj\u0105. Raporty s\u0105 przechowywane przez dob\u0119; przycisk sprawdza ponownie po wprowadzeniu zmian.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92113,92283,92077,92286],"class_list":["post-13516","page","type-page","status-publish","hentry","tag-e-commerce-pl","tag-web-performance-pl","tag-web-security-pl","tag-wordpress-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>WordPress Site Health Analyzer - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WordPress Site Health Analyzer - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Wystarczy jeden adres: raport ocenia blog WordPress lub sklep WooCommerce pod k\u0105tem cache stron, kompresji, HTTP\/2, skrypt\u00f3w blokuj\u0105cych renderowanie, \u0142adowania obraz\u00f3w, fragment\u00f3w koszyka na ka\u017cdej stronie, wyciek\u00f3w wersji i otwartego XML-RPC \u2013 z punktacj\u0105. Raporty s\u0105 przechowywane przez dob\u0119; przycisk sprawdza ponownie po wprowadzeniu zmian.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-site-health-analyzer\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-site-health-analyzer\\\/\",\"name\":\"WordPress Site Health Analyzer - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-02T07:48:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-site-health-analyzer\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-site-health-analyzer\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-site-health-analyzer\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"WordPress Site Health Analyzer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WordPress Site Health Analyzer - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/","og_locale":"en_US","og_type":"article","og_title":"WordPress Site Health Analyzer - Lukas Wojcik - Blog","og_description":"Wystarczy jeden adres: raport ocenia blog WordPress lub sklep WooCommerce pod k\u0105tem cache stron, kompresji, HTTP\/2, skrypt\u00f3w blokuj\u0105cych renderowanie, \u0142adowania obraz\u00f3w, fragment\u00f3w koszyka na ka\u017cdej stronie, wyciek\u00f3w wersji i otwartego XML-RPC \u2013 z punktacj\u0105. Raporty s\u0105 przechowywane przez dob\u0119; przycisk sprawdza ponownie po wprowadzeniu zmian.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/","name":"WordPress Site Health Analyzer - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-02T07:48:28+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-site-health-analyzer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"WordPress Site Health Analyzer"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13516","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13516"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/13516\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13516"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}