{"id":15726,"date":"2026-09-06T11:09:54","date_gmt":"2026-09-06T09:09:54","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/wordpress-rest-route-inventory\/"},"modified":"2026-09-06T11:09:54","modified_gmt":"2026-09-06T09:09:54","slug":"wordpress-rest-route-inventory","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-rest-route-inventory\/","title":{"rendered":"Inwentarz tras REST WordPressa: co witryna wydaje bez logowania"},"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;\">Katalog pod \/wp-json\/ wymienia ka\u017cd\u0105 zarejestrowan\u0105 tras\u0119, tak\u017ce trasy ka\u017cdej wtyczki. O uprawnieniach nie m\u00f3wi nic: sprawdzenie tkwi w samej trasie i wykonuje si\u0119 dopiero przy wywo\u0142aniu. To narz\u0119dzie robi wi\u0119c obie rzeczy \u2014 czyta katalog, a potem pobiera dziesi\u0119\u0107 znanych tras bez danych logowania.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"rs-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adres instalacji WordPressa<\/label><br \/>\n        <input id=\"rs-url\" type=\"text\" value=\"https:\/\/wordpress.org\/news\" 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;\"><\/p>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.78rem; margin: 5px 0 0;\">Adres, pod kt\u00f3rym dzia\u0142a witryna, wraz z podkatalogiem w rodzaju \/blog, je\u015bli taki istnieje.<\/p>\n<\/p><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Z tego serwera wychodzi jedena\u015bcie \u017c\u0105da\u0144 odczytu: katalog i dziesi\u0119\u0107 znanych tras. Nic nie jest zapisywane, logowanie nie nast\u0119puje. Zapisywane jest tylko samo zapytanie, na potrzeby limitu godzinowego.<\/p>\n<p>    <button id=\"rs-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;\">Odczytaj trasy<\/button><\/p>\n<div id=\"rs-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Pi\u0119\u0107 zapyta\u0144 na godzin\u0119. Wy\u0142\u0105cznie GET na adresy standardowe, prywatne zakresy adres\u00f3w s\u0105 odrzucane.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Katalog pod \\\/wp-json\\\/ wymienia ka\u017cd\u0105 zarejestrowan\u0105 tras\u0119, tak\u017ce trasy ka\u017cdej wtyczki. O uprawnieniach nie m\u00f3wi nic: sprawdzenie tkwi w samej trasie i wykonuje si\u0119 dopiero przy wywo\u0142aniu. To narz\u0119dzie robi wi\u0119c obie rzeczy \u2014 czyta katalog, a potem pobiera dziesi\u0119\u0107 znanych tras bez danych logowania.\",\"label_url\":\"Adres instalacji WordPressa\",\"hinweis_url\":\"Adres, pod kt\u00f3rym dzia\u0142a witryna, wraz z podkatalogiem w rodzaju \\\/blog, je\u015bli taki istnieje.\",\"datenschutz\":\"Z tego serwera wychodzi jedena\u015bcie \u017c\u0105da\u0144 odczytu: katalog i dziesi\u0119\u0107 znanych tras. Nic nie jest zapisywane, logowanie nie nast\u0119puje. Zapisywane jest tylko samo zapytanie, na potrzeby limitu godzinowego.\",\"knopf\":\"Odczytaj trasy\",\"grenze\":\"Pi\u0119\u0107 zapyta\u0144 na godzin\u0119. Wy\u0142\u0105cznie GET na adresy standardowe, prywatne zakresy adres\u00f3w s\u0105 odrzucane.\",\"laeuft\":\"Trwa odczyt katalogu i pobieranie tras pr\u00f3bnych \u2026\",\"urteil_gut\":\"Nic nie stoi na przeszkodzie\",\"urteil_warnung\":\"Warte spojrzenia\",\"urteil_kritisch\":\"Wymaga uwagi\",\"zusammenfassung\":\"Tras: {routen} w {raeume} przestrzeniach nazw, z czego {schreibend} przyjmuje metody zapisu.\",\"kein_verzeichnis_text\":\"Pod tym adresem nie da\u0142o si\u0119 odczyta\u0107 katalogu tras.\",\"h_proben\":\"Pr\u00f3ba, pobrana bez logowania\",\"proben_hinweis\":\"Otwarta znaczy, \u017ce trasa odpowiedzia\u0142a kodem 200 i tre\u015bci\u0105. Chroniona znaczy, \u017ce sprawdzenie uprawnie\u0144 odm\u00f3wi\u0142o kodem 401 albo 403. Brak znaczy 404.\",\"h_raeume\":\"Przestrzenie nazw\",\"h_seite\":\"Co katalog m\u00f3wi o witrynie\",\"h_befunde\":\"Ustalenia\",\"spalte_route\":\"Trasa\",\"spalte_zustand\":\"Stan\",\"spalte_status\":\"Status\",\"spalte_anzahl\":\"Wpisy\",\"spalte_raum\":\"Przestrze\u0144 nazw\",\"spalte_routen\":\"Trasy\",\"zustand_offen\":\"otwarta\",\"zustand_geschuetzt\":\"chroniona\",\"zustand_fehlt\":\"brak\",\"zustand_gesperrt\":\"zablokowana\",\"zustand_fehler\":\"b\u0142\u0105d\",\"zeile_name\":\"Nazwa\",\"zeile_beschreibung\":\"Opis\",\"zeile_sprache\":\"J\u0119zyk\",\"zeile_zeitzone\":\"Strefa czasowa\",\"zeile_anmeldung\":\"Metody uwierzytelniania\",\"zeile_weg\":\"Posta\u0107 tras\",\"zeile_dauer\":\"Czas\",\"zeile_limit\":\"Pozosta\u0142e zapytania w tej godzinie\",\"keine_anmeldung\":\"\u017cadnej nie podano\",\"weg_wp_json\":\"\\\/wp-json\\\/ (przyjazne odno\u015bniki)\",\"weg_rest_route\":\"?rest_route= (odno\u015bniki proste)\",\"keine_befunde\":\"Brak ustale\u0144.\",\"stufe_hoch\":\"Wysoki\",\"stufe_mittel\":\"\u015aredni\",\"stufe_niedrig\":\"Niski\",\"stufe_info\":\"Uwaga\",\"stufe_gut\":\"Dobrze\",\"befund_kein_verzeichnis\":\"Katalogu nie uda\u0142o si\u0119 pobra\u0107 || Pobranie nie powiod\u0142o si\u0119: {fehler}.\",\"befund_rest_abgeschaltet\":\"Katalog tras odpowiada kodem 404 || Albo interfejs REST jest wy\u0142\u0105czony, albo co\u015b przed nim blokuje ten adres.\",\"befund_rest_gesperrt\":\"Katalog tras jest chroniony || Status {status}: ju\u017c odczyt katalogu wymaga logowania.\",\"befund_kein_json\":\"Brak JSON-a pod adresem katalogu || Status {status}, typ tre\u015bci {typ}. Co\u015b tam odpowiada, ale nie interfejs REST.\",\"befund_json_unlesbar\":\"Katalog nie jest czytelnym JSON-em || Odpowied\u017a dotar\u0142a, ale nie da\u0142a si\u0119 roz\u0142o\u017cy\u0107.\",\"befund_benutzer_offen\":\"Lista u\u017cytkownik\u00f3w jest otwarta || \\\/wp\\\/v2\\\/users odpowiedzia\u0142a {anzahl} wpisami. Nazwy i skr\u00f3ty logowania to pierwsza po\u0142owa pr\u00f3by zalogowania, a ta trasa wydaje je bez \u017cadnego logowania.\",\"befund_benutzer_zu\":\"Lista u\u017cytkownik\u00f3w nie jest otwarta || Status {status}. Albo trasa jest wy\u0142\u0105czona, albo sprawdzenie uprawnie\u0144 odmawia.\",\"befund_route_offen_settings\":\"Ustawienia s\u0105 czytelne || {pfad} odpowiedzia\u0142a kodem 200. W instalacji domy\u015blnej ta trasa wymaga uprawnie\u0144 administratora.\",\"befund_route_offen_plugins\":\"Lista wtyczek jest czytelna || {pfad} odpowiedzia\u0142a kodem 200. Numery wersji zainstalowanych wtyczek to najkr\u00f3tsza droga do pasuj\u0105cego ataku.\",\"befund_route_offen_themes\":\"Lista motyw\u00f3w jest czytelna || {pfad} odpowiedzia\u0142a kodem 200. W instalacji domy\u015blnej ta trasa nie jest publiczna.\",\"befund_inhalte_offen\":\"Wpisy s\u0105 czytelne || {anzahl} wpis\u00f3w pod \\\/wp\\\/v2\\\/posts. Dla tre\u015bci opublikowanych jest to zachowanie zamierzone.\",\"befund_verzeichnis_offen\":\"Sam katalog jest czytelny || Tras: {routen} w {raeume} przestrzeniach nazw. To ustawienie domy\u015blne \u2014 a zarazem pe\u0142na lista wtyczek, kt\u00f3re rejestruj\u0105 trasy.\",\"befund_schreibende_routen\":\"Tras przyjmuj\u0105cych metody zapisu: {anzahl} || Tak podaje katalog. O tym, czy cokolwiek dopuszczaj\u0105, decyduje ich w\u0142asne sprawdzenie uprawnie\u0144, a nie ta lista.\",\"befund_fremde_namensraeume\":\"Przestrzeni nazw spoza rdzenia WordPressa: {anzahl} || Na przyk\u0142ad {raeume}. Ka\u017cda pochodzi z wtyczki i j\u0105 nazywa.\",\"befund_ohne_huebsche_adressen\":\"Katalog odpowiada tylko pod ?rest_route= || Przyjazne odno\u015bniki s\u0105 wy\u0142\u0105czone, interfejs REST jest osi\u0105galny przez ci\u0105g zapytania.\",\"befund_seitendaten\":\"Nazwa i opis witryny stoj\u0105 w katalogu || Jest to zamierzone i publiczne \u2014 i stoi tak\u017ce w katalogu witryny, kt\u00f3ra poza tym nic nie ujawnia.\",\"fehler_adresse\":\"Tego adresu nie da si\u0119 u\u017cy\u0107.\",\"fehler_netz\":\"Serwer by\u0142 nieosi\u0105galny.\",\"fehler_antwort\":\"Odpowied\u017a by\u0142a nieczytelna.\",\"fehler_captcha\":\"Sprawdzenie antyspamowe nie powiod\u0142o si\u0119. Zwykle pomaga ponowne wczytanie strony.\",\"fehler_kein_token\":\"Sprawdzenie antyspamowe nie dostarczy\u0142o znacznika.\",\"fehler_zu_viele\":\"Osi\u0105gni\u0119to limit {limit} zapyta\u0144 na godzin\u0119.\",\"fehler_zaehler\":\"Licznik jest niedost\u0119pny.\",\"fehler_pruefdienst\":\"Sprawdzenie antyspamowe jest niedost\u0119pne.\",\"fehler_aufbau\":\"Narz\u0119dzie jest b\u0142\u0119dnie skonfigurowane.\",\"fehler_methode\":\"Nieprawid\u0142owa metoda \u017c\u0105dania.\",\"fehler_eingabe\":\"Dane wej\u015bciowe by\u0142y nieczytelne.\",\"fehler_unbekannt\":\"Co\u015b posz\u0142o nie tak.\",\"grund_leer\":\"Nie podano adresu.\",\"grund_zu_lang\":\"Adres jest za d\u0142ugi.\",\"grund_schema\":\"Dzia\u0142aj\u0105 wy\u0142\u0105cznie http i https.\",\"grund_unlesbar\":\"Adresu nie da\u0142o si\u0119 roz\u0142o\u017cy\u0107.\",\"grund_benutzerinfo\":\"Adresy z nazw\u0105 u\u017cytkownika s\u0105 odrzucane.\",\"grund_gesperrter_bereich\":\"Ten adres wskazuje do sieci prywatnej.\",\"grund_kein_punkt\":\"Nazwa hosta potrzebuje kropki.\",\"grund_hostform\":\"Potrzebna jest nazwa domeny, nie adres IP.\",\"grund_port\":\"Ten port nie jest dopuszczony.\",\"grund_kein_dns\":\"Nazwa si\u0119 nie rozwi\u0105zuje.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-restrouten.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var ZUSTAENDE = ['offen', 'geschuetzt', 'fehlt', 'gesperrt', 'fehler'];\n    var PROBEN = ['users', 'settings', 'plugins', 'themes', 'posts', 'pages', 'media', 'comments', 'types', 'search'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, 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 rohProben = (a.proben && typeof a.proben === 'object') ? a.proben : {};\n        var proben = [];\n        PROBEN.forEach(function (k) {\n            var p = rohProben[k];\n            if (!p) { return; }\n            proben.push({ key: k, pfad: String(p.pfad || ''), status: zahl(p.status),\n                zustand: ZUSTAENDE.indexOf(p.zustand) === -1 ? 'fehler' : p.zustand, anzahl: zahl(p.anzahl) });\n        });\n        var s = (a.seite && typeof a.seite === 'object') ? a.seite : {};\n        return {\n            fehler: null,\n            basis: a.basis ? String(a.basis) : '',\n            erreichbar: !!a.erreichbar,\n            weg: a.weg === 'rest_route' ? 'rest_route' : 'wp-json',\n            status: zahl(a.status),\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            routen: zahl(a.routen_gesamt) || 0,\n            raeume: zahl(a.raeume_gesamt) || 0,\n            schreibend: zahl(a.schreibend) || 0,\n            namensraeume: liste(a.namensraeume).map(function (x) { x = x || {}; return { raum: String(x.raum || ''), routen: zahl(x.routen) || 0 }; }),\n            proben: proben,\n            seite: { name: s.name ? String(s.name) : null, beschreibung: s.beschreibung ? String(s.beschreibung) : null,\n                sprache: s.sprache ? String(s.sprache) : null, zeitzone: s.zeitzone ? String(s.zeitzone) : null,\n                anmeldung: liste(s.anmeldung).map(String) },\n            befunde: befunde, stufengruppen: gruppen,\n            dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\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); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\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: 'restrouten' }).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) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.RS = { bewerten: bewerten, darstellen: null, text: text,\n        ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, ZUSTAENDE: ZUSTAENDE, PROBEN: PROBEN, T: T };<\/p>\n<p>    var btn = document.getElementById('rs-btn');\n    var out = document.getElementById('rs-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined && txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    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;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    var ZUSTAND_FARBE = { offen: WARN, geschuetzt: GUT, fehlt: GRAU, gesperrt: GRAU, fehler: ROT };\n    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) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }<\/p>\n<p>    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 && T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }<\/p>\n<p>        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 6px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));\n        if (!b.erreichbar) {\n            ziel.appendChild(el('p', ZELLE + ' margin: 0 0 12px;', T.kein_verzeichnis_text));\n        } else {\n            ziel.appendChild(el('p', ZELLE + ' margin: 0 0 12px;', text('zusammenfassung', { routen: b.routen, raeume: b.raeume, schreibend: b.schreibend })));<\/p>\n<p>            \/\/ --- Die Stichproben: der eigentliche Kern\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_proben));\n            ziel.appendChild(el('p', ZELLE + ' margin: 0 0 8px;', T.proben_hinweis));\n            var hp = el('div', 'overflow-x: auto;');\n            var gp = gitter('auto auto auto auto');\n            [T.spalte_route, T.spalte_zustand, T.spalte_status, T.spalte_anzahl].forEach(function (s) {\n                gp.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s));\n            });\n            b.proben.forEach(function (p) {\n                gp.appendChild(el('div', ZELLE_WERT + ' white-space: nowrap;', p.pfad));\n                gp.appendChild(el('div', ZELLE_WERT + ZUSTAND_FARBE[p.zustand] + ' white-space: nowrap;', T['zustand_' + p.zustand]));\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, p.status === null ? '-' : String(p.status)));\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, p.anzahl === null ? '-' : String(p.anzahl)));\n            });\n            hp.appendChild(gp);\n            ziel.appendChild(hp);<\/p>\n<p>            \/\/ --- Namensraeume\n            if (b.namensraeume.length) {\n                ziel.appendChild(el('div', UEBERSCHRIFT, T.h_raeume));\n                var hr = el('div', 'overflow-x: auto;');\n                var gr = gitter('auto auto');\n                [T.spalte_raum, T.spalte_routen].forEach(function (s) {\n                    gr.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s));\n                });\n                b.namensraeume.forEach(function (n) {\n                    gr.appendChild(el('div', ZELLE_WERT + ' white-space: nowrap;', n.raum));\n                    gr.appendChild(el('div', ZELLE_WERT + GRAU, String(n.routen)));\n                });\n                hr.appendChild(gr);\n                ziel.appendChild(hr);\n            }<\/p>\n<p>            \/\/ --- Was das Verzeichnis ueber die Seite sagt\n            ziel.appendChild(el('div', UEBERSCHRIFT, T.h_seite));\n            var gs = gitter('auto auto');\n            paar(gs, T.zeile_name, b.seite.name || '-', GRAU);\n            paar(gs, T.zeile_beschreibung, b.seite.beschreibung || '-', GRAU);\n            paar(gs, T.zeile_sprache, b.seite.sprache || '-', GRAU);\n            paar(gs, T.zeile_zeitzone, b.seite.zeitzone || '-', GRAU);\n            paar(gs, T.zeile_anmeldung, b.seite.anmeldung.length ? b.seite.anmeldung.join(', ') : T.keine_anmeldung, GRAU);\n            paar(gs, T.zeile_weg, b.weg === 'rest_route' ? T.weg_rest_route : T.weg_wp_json, GRAU);\n            if (b.dauer !== null) { paar(gs, T.zeile_dauer, b.dauer + ' ms', GRAU); }\n            if (b.limitRest !== null) { paar(gs, T.zeile_limit, String(b.limitRest), GRAU); }\n            ziel.appendChild(gs);\n        }<\/p>\n<p>        \/\/ --- Befunde\n        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var g2 = b.stufengruppen[s];\n            if (!g2.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] + ' (' + g2.length + ')'));\n            g2.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var d = {};\n                Object.keys(f.daten).forEach(function (n) {\n                    var w = f.daten[n];\n                    d[n] = Array.isArray(w) ? w.join(', ') : w;\n                });\n                var t = text('befund_' + f.key, d) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.RS.darstellen = darstellen;<\/p>\n<p>    var laeuft = false;\n    btn.addEventListener('click', function () {\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        abfragen(wert('rs-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Narz\u0119dzie czyta katalog tras pod \/wp-json\/, zlicza trasy i przestrzenie nazw, a nast\u0119pnie pobiera dziesi\u0119\u0107 znanych tras bez \u017cadnych danych logowania \u2014 katalog m\u00f3wi bowiem tylko, jakie trasy istniej\u0105, nigdy za\u015b kto mo\u017ce je czyta\u0107. Dopiero ten drugi krok oddziela tras\u0119 wymienion\u0105 od otwartej.<\/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":[92762,92077,92286],"class_list":["post-15726","page","type-page","status-publish","hentry","tag-web-development-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>Inwentarz tras REST WordPressa: co witryna wydaje bez logowania - 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-rest-route-inventory\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Inwentarz tras REST WordPressa: co witryna wydaje bez logowania - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Narz\u0119dzie czyta katalog tras pod \/wp-json\/, zlicza trasy i przestrzenie nazw, a nast\u0119pnie pobiera dziesi\u0119\u0107 znanych tras bez \u017cadnych danych logowania \u2014 katalog m\u00f3wi bowiem tylko, jakie trasy istniej\u0105, nigdy za\u015b kto mo\u017ce je czyta\u0107. Dopiero ten drugi krok oddziela tras\u0119 wymienion\u0105 od otwartej.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-rest-route-inventory\/\" \/>\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-rest-route-inventory\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-rest-route-inventory\\\/\",\"name\":\"Inwentarz tras REST WordPressa: co witryna wydaje bez logowania - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-06T09:09:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-rest-route-inventory\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-rest-route-inventory\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/wordpress-rest-route-inventory\\\/#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\":\"Inwentarz tras REST WordPressa: co witryna wydaje bez logowania\"}]},{\"@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":"Inwentarz tras REST WordPressa: co witryna wydaje bez logowania - 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-rest-route-inventory\/","og_locale":"en_US","og_type":"article","og_title":"Inwentarz tras REST WordPressa: co witryna wydaje bez logowania - Lukas Wojcik - Blog","og_description":"Narz\u0119dzie czyta katalog tras pod \/wp-json\/, zlicza trasy i przestrzenie nazw, a nast\u0119pnie pobiera dziesi\u0119\u0107 znanych tras bez \u017cadnych danych logowania \u2014 katalog m\u00f3wi bowiem tylko, jakie trasy istniej\u0105, nigdy za\u015b kto mo\u017ce je czyta\u0107. Dopiero ten drugi krok oddziela tras\u0119 wymienion\u0105 od otwartej.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-rest-route-inventory\/","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-rest-route-inventory\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-rest-route-inventory\/","name":"Inwentarz tras REST WordPressa: co witryna wydaje bez logowania - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-06T09:09:54+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-rest-route-inventory\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-rest-route-inventory\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/wordpress-rest-route-inventory\/#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":"Inwentarz tras REST WordPressa: co witryna wydaje bez logowania"}]},{"@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\/15726","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=15726"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15726\/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=15726"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}