Stage 3: Build
Ziel: Die Seite läuft lokal. Echte Inhalte werden durch Kernfunktionen gerendert. Anfragen werden gespeichert, dann weitergeleitet, dann bereinigt. Die Strukturtests sind grün.
Zuerst lesen: das AGENTS.md des Projekts, dann references/architecture.md.
Schritte
- Lokale Seite. Folge dem
README.mddes Projekts, Abschnitt „Erster Start“. Dann prüfen:ddev wp eval 'echo wp_get_environment_type();'musslocalausgeben. Falls nicht, siehereferences/local-env.md. Solange es nichtlocalausgibt, glaubt die Seite, sie sei in Produktion: Sie kann indexiert werden und echte Kunden per E-Mail erreichen. - Beispiel-Inhaltstyp umbenennen. Dies tun, bevor Inhalte existieren.
<prefix>_offerwird zum geschäftsspezifischen Begriff (Tour, Service, Kurs): der Post-Typ, der Rewrite-Slug und die Labels inmodules/content.php, sowie die Funktionsnamen (_get_offers,_render_offer_card), die Dateiparts/offer-card.phpund die Tests. Post-Typ-Namen haben ein 20-Zeichen-Limit. - Inhalt modellieren. Finde jedes Feld, das die Aufgabenstellung benötigt. Registriere jedes als Post-Meta mit einem Sanitize-Callback und einem Auth-Callback. Preise sind Zahlen in Meta. 0 bedeutet „auf Anfrage“, niemals „kostenlos“. Wenn Redakteure umfangreichere Feldbildschirme benötigen, füge ACF (kostenlos) hinzu, aber lese Werte nur über Kernfunktionen aus.
- Datendateien → Generator (wenn der Eigentümer viele Elemente bereitstellt):
- eine Markdown- oder JSON-Datei pro Element in
docs/data/<type>/ablegen; - ein idempotentes WP-CLI-Skript schreiben, das Beiträge aus diesen Dateien erstellt oder aktualisiert;
- mit
--dry-runversehen; - ausführen mit
ddev wp eval-file - < scripts/<name>.php. Die Dateien sind die überprüfbare Wahrheit; die Datenbank ist die Kopie.
- eine Markdown- oder JSON-Datei pro Element in
- Vorlagen rufen eine Kernfunktion pro Abschnitt auf.
- Layout lebt im Theme: Vorlagen,
parts/, Skin-Überschreibungen. - Daten, Abfragen, Preise, Richtlinientexte und Formulare kommen aus dem Kern.
- Jeden Aufruf mit
function_exists()schützen, damit eine Vorlage nie abstürzt, wenn das Plugin fehlt.
- Layout lebt im Theme: Vorlagen,
- Anfragen. Halte die Pipeline in
modules/enquiry.php(references/forms-and-leads.md).- Felder an drei Stellen gleichzeitig hinzufügen: im Formular, im Handler und im Details-Bereich.
- Posteingang und Absender in
wp-config.php-Konstanten setzen, niemals im Code.
- Richtlinientext (AGB, Anzahlungen, Stornierung): im Kern als eine Funktion ablegen (z. B.
<prefix>_policy( 'cancellation' )). Vorlagen geben diese Funktion aus, und ein Test schlägt fehl, wenn eine Vorlage einen Richtlinientext fest codiert. - Neues Modul? Eine Datei in
modules/hinzufügen, einerequire_once-Zeile im Bootstrap undtests/structure/core.spec.tsim selben Commit aktualisieren. - Prüfen und committen.
npm run test:structureundnpm run lint:phpausführen (0 Fehler).- Den wp-rules-reviewer-Agenten bitten, den Diff zu überprüfen.
- Committen (Conventional Commits).
Tor (in SITE_STATUS.md abhaken)
-
wp_get_environment_type()= local - Kern-Plugin und Child-Theme aktiv; Skin lädt
- Echte Inhalte werden durch Kernfunktionen gerendert; keine fest codierten Karten, Preise oder Slugs
- Anfrage: gespeichert → per E-Mail gesendet → erneuter Versuch → bereinigt; Ende-zu-Ende in Mailpit getestet
- Strukturtests grün; PHPCS 0 Fehler
Niemals
- Geschäftslogik,
WP_Query, Preise,pll_*-Aufrufe oder Richtlinientext im Theme. - Rohe
$_POSToder$_GETohnewp_unslash+ eine Sanitize-Funktion; Ausgabe ohneesc_*. - Drittanbieter-API-Schlüssel oder Endpunkte in HTML oder JS. Vom Server aus weiterleiten.
- Plugin-Module mit rohem
wp option updateumschalten. Die eigene UI oder CLI des Plugins verwenden, dann jede betroffene Seite erneut prüfen. - Unpräfixierte Funktionen, Optionen, Hooks, Meta-Schlüssel oder Nonces.