Builder-Log – Zyklus 2 (Prüfung der Seite / Skripte)

_Datum: 2026-08-30 · Branch: claude/searchnsale-de-page-lm8zfd · Nur READ/Analyse, keine Repo-Dateien verändert._

Kurz-Zusammenfassung

Geprüft wurden alle relevanten Dateien: das Publish-Skript, alle Content-HTMLs, alle Produkt-JSONs, Theme + Design-Plugin (PHP/JSON/CSS/Templates/Parts), Menü-Quellen, claude_desktop_config.json und die READMEs. Automatische Checks (node --check, JSON-Parse, php -l, Gutenberg-Block-Balance, Asset-/Klassen-/Link-Querschnitt) laufen sauber.

Es gibt keine kritischen Fehler. Das Skript ist syntaktisch und logisch korrekt, die beiden neuen Seiten sind sauber eingebunden, das Menü ist über die vier Kernquellen konsistent, das Encoding ist sauberes UTF-8. Gefunden wurden 1x mittel-relevante Doku-Inkonsistenz, 1x mittel-relevantes Kategorie-Slug/Filter-Thema und mehrere geringe Punkte (tote In-Page-Anker, Platzhaltertexte, kosmetischer Streichpreis, ungenutztes Asset).

Findings nach Schweregrad: kritisch: 0 · mittel: 2 · gering: 5

Durchgeführte automatische Checks (alle grün)

Check Ergebnis
node --check scripts/publish-to-wordpress.mjs OK
JSON-Parse: claude_desktop_config.json, 5× content/produkte/*.json, menu.json, theme.json alle OK
php -l für alle 6 PHP-Dateien im Plugin keine Syntaxfehler
Gutenberg-Block-Balance (wp: vs /wp:, inkl. self-closing) in allen HTML/Pattern/Template/Part-Dateien ausgeglichen
sns-* Klassen (17 benutzt) ⊆ in tokens.css definiert (19) vollständig abgedeckt
Referenzierte assets/img/*.svg existieren alle vorhanden
Encoding / Mojibake kein Mojibake, sauberes UTF-8

Findings

[mittel] menue/README.md ist nicht mit den neuen Nav-Einträgen synchron

  • Datei:Zeile: manuell_upload/menue/README.md:22-29 (Abschnitt B, klassisches Theme) und :33-42 (Abschnitt C, WP-CLI)
  • Problem: Beide Anleitungen listen nur Startseite, Shop (+Pro-Audio/HiFi/Licht & Bühne) und Ratgeber. Die in Zyklus 2 neu hinzugekommenen Einträge Vermietung (/vermietung) und Funkfrequenz-Check (/funkfrequenz-check-2026) fehlen. Die vier tatsächlichen Nav-Quellen (menu.json, menue/hauptmenue.html, theme/.../parts/header.html, plugin/.../patterns/header-nav.php) enthalten diese Einträge dagegen konsistent. Wer die klassische bzw. WP-CLI-Anleitung befolgt, baut ein unvollständiges Menü.
  • Fix: In Abschnitt B (Tabelle) und C (WP-CLI) je zwei Zeilen ergänzen: Vermietung /vermietung und Funkfrequenz-Check /funkfrequenz-check-2026 (z. B. wp menu item add-custom hauptmenu "Vermietung" /vermietung).

[mittel] Kategorie-Filter-Links: Slug „licht-buehne“ passt nicht zum Auto-Slug; ?cat= ist nicht Woo-Standard

  • Datei:Zeile: u. a. content/startseite.html:91, content/shop-uebersicht.html:53,79, content/funkfrequenz-check-2026.html:92, menu.json:12, menue/hauptmenue.html:12 (Link /shop?cat=licht-buehne); Kategorie-Anlage in scripts/publish-to-wordpress.mjs:117-127.
  • Problem: (a) Der Resolver legt Kategorien nur über { name } an und überlässt WooCommerce den Slug. „Pro-Audio“→pro-audio und „HiFi“→hifi passen zu den Links, aber „Licht & Bühne“ wird von WordPress zu licht-buhne/licht-bühne slugifiziert – nicht zu dem in den Links/Menüs verwendeten licht-buehne. (b) ?cat= ist die Core-Post-Kategorie-Query-Var, nicht WooCommerces Produktkategorie-Filter (?product_cat=<slug> bzw. Archiv /product-category/<slug>/). Ohne Zusatzkonfiguration filtern diese CTAs die Produkte nicht.
  • Fix: In den Produkt-JSONs bzw. im Skript einen expliziten slug je Kategorie setzen ("categories":[{ "name":"Licht & Bühne","slug":"licht-buehne" }] und im Resolver mitsenden) und die Links auf ?product_cat=… bzw. die echten Kategorie-Archiv-URLs umstellen – oder umgekehrt die Link-Slugs an die tatsächlichen Woo-Slugs anpassen. Wichtig: Slug an einer Stelle definieren und überall gleich verwenden.

[gering] Tote In-Page-Anker: #mietanfrage und #opt-in

  • Datei:Zeile: content/vermietung.html:19 und :106 (Button → #mietanfrage); content/funkfrequenz-check-2026.html:29 (Button → #opt-in).
  • Problem: Kein Element mit id="mietanfrage" bzw. id="opt-in" auf der Seite – die Formulare stehen nur als Platzhalter-Kommentar (vermietung.html:102, funkfrequenz-check-2026.html:24). Bis das Formular-Plugin/-Shortcode mit passender ID eingesetzt ist, scrollen die CTA-Buttons ins Leere.
  • Fix: Beim Einsetzen des Formulars dem Container die passende id geben (id="mietanfrage" / id="opt-in") bzw. einen Anker ergänzen.

[gering] Platzhaltertexte würden bei Veröffentlichung wörtlich live gehen

  • Datei:Zeile: alle 5 content/produkte/*.json (Description: „[Platzhalter: Rückgaberecht/Käuferschutz]“); content/shop-uebersicht.html:100 und content/informationsseite.html:89 („[Platzhalter: Rückgaberecht / Käuferschutz]“); content/vermietung.html:81 („[Platzhalter: Konditionen]“).
  • Problem: Das Skript legt zwar als Entwurf an (Absicherung greift), aber unverändert veröffentlicht erscheinen die Klammer-Platzhalter im Frontend.
  • Fix: Vor der Veröffentlichung durch die realen Konditionen ersetzen (bewusst als Platzhalter belassen ist OK, dann vor „publish“ prüfen).

[gering] Startseiten-Streichpreis nicht durch Produktdaten gedeckt

  • Datei:Zeile: content/startseite.html:115 zeigt Shure SM58 „69,00 € 115,00 €„, aber content/produkte/01-shure-sm58.json hat nur regular_price "69.00" (kein sale_price/115).
  • Problem: Die Homepage-Kachel ist statisch (nicht datengetrieben); der „Vorher“-Preis 115 ist erfunden und deckt sich nicht mit dem Produkt. Rein kosmetisch, aber inkonsistent.
  • Fix: Entweder im JSON regular_price "115.00" + sale_price "69.00" setzen (dann stimmt der Streichpreis), oder den durchgestrichenen Preis auf der Startseite entfernen.

[gering] Ungenutztes Asset p-headphones.svg

  • Datei: manuell_upload/plugin/searchnsale-design/assets/img/p-headphones.svg
  • Problem: Existiert, wird aber von keiner Seite/keinem Pattern referenziert (Content nutzt p-mic, p-speaker, p-amp). Kein Fehler, nur Info.
  • Fix: Optional in einer Produktkachel verwenden (z. B. Sennheiser HD 25) oder belassen.

[Beobachtung, gering] Kategorie-Zuordnung Kopfhörer / PA quer zur Startseiten-Taxonomie

  • content/produkte/05-sennheiser-hd25.json liegt unter Pro-Audio + Kopfhörer, während die Startseiten-/Pattern-Kachel „Kopfhörer“ der HiFi-Kategorie zuordnet. 03-qsc-k12-2.json (PA-Box) liegt unter Licht & Bühne (Shop nennt „PA-Systeme“ dort). Beides vertretbar (DJ-Kopfhörer = Pro-Audio, PA unter Bühne), aber nicht 1:1 deckungsgleich mit den drei Marketing-Kategorien. Kein Handlungsbedarf, nur zur Kenntnis für ein stimmiges Taxonomie-Konzept.

Was geprüft und sauber ist

  • scripts/publish-to-wordpress.mjsnode --check OK. Kategorie-Resolver (resolveCategoryId/mapCategories, Zeilen 116-141) löst {name}→ID auf, findet per exaktem c.name === name, legt sonst an, cached pro Lauf. SKU-Idempotenz korrekt: Lookup ?sku=, vorhanden → PUT /products/{id}, sonst POST (Zeilen 152-162). Seiten idempotent per Slug (status=any), Update per POST auf /pages/{id} (Zeilen 83-95). ENV-Handling sauber (requireEnv, Zeilen 41-47; Produkte laufen im „all“-Modus nur bei gesetzten WC-Keys, Zeile 168). Beide neuen Seiten stehen in PAGES (Zeilen 72-73), beide Dateien existieren. --dry-run/--front konsistent.
  • Content-HTML (alle 5) – Gutenberg-Block-Markup vollständig ausgeglichen; interne CTAs verweisen ausschließlich auf real erzeugte Slugs (/, /shop, /vermietung, /gebraucht-kaufen-verkaufen, /funkfrequenz-check-2026); sauberes UTF-8, keine kaputten Umlaute.
  • *content/produkte/.json** – valides JSON, einheitliche Struktur, 5 eindeutige SKUs (SNS-SM58-001, SNS-MG10XU-001, SNS-K122-001, SNS-PMA600NE-001, SNS-HD25-001), eindeutige Preise, Kategorien im vom Resolver erwarteten [{ "name": … }]-Format.
  • Theme searchnsaletheme.json valide (v2, Palette/Typo/Spacing, templateParts header+footer). style.css mit gültigem Theme-Header (Name/Version/Requires) – vollständiges Block-Theme (kein „nur theme.json“-Fehlerfall). Templates (index/page/single) referenzieren die vorhandenen Parts header/footer; Block-Balance inkl. self-closing korrekt.
  • Plugin searchnsale-design – alle 6 PHP-Dateien ohne Syntaxfehler. Pattern-Registrierung (searchnsale-design.php:47-85) registriert Kategorie searchnsale + 5 Patterns; alle referenzierten patterns/.php existieren. Assets/Fonts via enqueue_block_assets (Frontend+Editor). Alle sns--Klassen aus Content/Patterns/Parts sind in assets/tokens.css definiert.
  • Menü-Konsistenz (Kernquellen)menu.json, hauptmenue.html, parts/header.html, patterns/header-nav.php enthalten identisch: Startseite, Shop, Vermietung, Ratgeber, Funkfrequenz-Check (plus Shop-Unterpunkte in menu.json). Ausnahme siehe Finding zu menue/README.md.
  • claude_desktop_config.json – valides JSON; enthält nur den Platzhalter DEIN_WSP_MCP_TOKEN, kein echtes Secret. Die README dokumentiert korrekt, dass der historisch committete Token in WordPress rotiert werden muss.
  • Querschnitt README/Content/Produkte/Theme/Menü – Kategorien (Pro-Audio, HiFi, Licht & Bühne), Marken und Seiten-Slugs sind stimmig; keine toten Verweise außer den oben genannten (Slug-licht-buehne, ?cat=, #mietanfrage/#opt-in).

BUILDER COMPLETE