Files
WP-LIT-MCP/docs/superpowers/notes/2026-10-19-etappe-4e-recherche-schleifen.md
T

52 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Etappe 4e – Divi-Schleifen: Recherche (Divi 5.15.1)
Stand 2026-10-20. **Hinweis zur Herkunft:** Die ursprüngliche Recherche (`research-4e-loop-divi.md` im Scratchpad der Planung) war nicht mehr auffindbar. Diese Notiz ist deshalb aus den Belegen rekonstruiert, die im Repo stehen: Security-Audit (`2026-10-19-etappe-4e-security-audit.md`), Task-Berichte der SDD-Läufe und der Divi-Quelltext 5.15.1 selbst. Sie enthält nur Fakten, die dort belegt sind; Zeilenangaben beziehen sich auf `includes/builder-5/server/Packages/Module/Options/Loop/` (Divi 5.15.1) und sind dort geprüft oder aus dem Audit übernommen.
## 1. Speicherort und Schalter
- Die Schleife steht im Block-Attribut `module.advanced.loop`, je Gerät und Zustand: `desktop.value.enable` (`"on"`) und `desktop.value.queryType`.
- Divi liest beide Werte mit `sanitize_key()`; fehlt `queryType`, gilt `post_types` (`LoopUtils.php:725-732`). Nur `desktop` zählt; Tablet-, Phone- und Hover-Varianten schalten keine Schleife (Ruling X1).
- Die Schleife wird beim Rendern aus dem **rohen** Dokument gelesen (`WP_Block_Parser`, `LoopUtils.php:4219-4229`). Presets (`LoopPresetAttrsMap`) starten, stoppen oder ändern eine Schleife auf der Website nicht.
## 2. `queryType`-Werte
| `queryType` | Art im Plugin | Bemerkung |
|---|---|---|
| `post_types`, `current_page` | Beiträge (post) | Standard bei fehlendem Wert |
| `post_taxonomies` | Terme (term) | Divi bildet ihn intern auf `terms` ab (`LoopUtils.php:735-738`) |
| `user_roles` | Benutzer (user) | |
| `menus` | Menü (menu) | |
| `terms`, `users` | Terme, Benutzer | Aliase, die Divi kennt (`LoopUtils.php:881-898`); das Plugin normalisiert wie `sanitize_key` (Audit L2) |
| `repeater_<ACF-Feld>` | nicht unterstützt | verlangt die Einstellung `acf_type`; `loop_*` darin wird abgelehnt (X7e) |
## 3. Kontext eines Moduls
- Maßgeblich ist die **innerste** eingeschaltete Schleife auf dem Weg Wurzel → Knoten, den Knoten selbst eingeschlossen (X1).
- Verschachtelte Schleifen: Hat die innere Schleife keine Treffer, gibt Divi den Block unverändert zurück (`__loop_no_results`, `LoopUtils.php:4449-4457`); die äußere Schleife löst danach die `$variable(…)$`-Verweise mit **ihrem** Objekt auf (`LoopUtils.php:4572-4598`). Deshalb gilt für `_meta_key_`-Optionen die Kettenregel (Audit M1).
- Innerhalb einer Schleife reicht Divi `loop_id`, `loop_query_type` und `loop_object` an jede Inhaltsvariable weiter.
## 4. `loop_*`-Optionen
- Divi registriert 34 Loop-Optionen. Die Art bestimmt die Gruppe der Option („Loop Terms“, „Loop Users“, übrige = Beiträge, Menü nach Name); die drei Meta-Schlüssel-Optionen `loop_post_meta_key_manual_custom_field`, `loop_user_…`, `loop_term_…` ordnet der Name zu, weil ihre Gruppennamen übersetzt sind.
- Gespeichert wird der Array-Schlüssel der Option (`loop_term_name`), nicht die interne `id`.
## 5. Gefahr des Fehlabgleichs (Sicherheitsgrenze)
- `loop_<post|user|term>_meta_key_*` entnimmt die Meta-Art dem **Namen** und liest die Metadaten des Objekts mit der **ID der Schleife** (`DynamicContentLoopOptions.php:145-158`). Eine Post-Meta-Option in einer Term- oder Benutzer-Schleife liest also die Metadaten des Beitrags mit derselben ID, auch von Entwürfen und privaten Beiträgen (umgekehrt Benutzer-/Term-Meta in einer Beitrags-Schleife).
- Die übrigen `loop_*`-Resolver prüfen `instanceof WP_Post`/`WP_Term`/`WP_User` und liefern für ein fremdes Objekt `''` (`LoopUtils.php:3162+`, `3553+`, `3599+`).
- Benutzer-Meta in Benutzer-Schleifen verlangt vom **Betrachter** `manage_users` (nicht ACF) bzw. `list_users` (ACF) (`DynamicContentACFUtils.php`); kein Leck an Besucher.
- Folge im Plugin: Ein `loop_*`-Wert ist nur erlaubt, wenn die Art des Schleifen-Kontexts zur Art der Option passt; ohne Schleife ist jede `loop_*`-Option abgelehnt.
## 6. Rendern außerhalb einer Schleife
Ohne Schleife in der Vorfahrenkette bleiben `loop_*`-Verweise ohne Quelle und rendern leer; das Plugin lehnt sie deshalb schon beim Schreiben ab, mit der Meldung „braucht eine Divi-Schleife“.
## 7. Grenzen (dokumentiert, nicht gelöst)
- **Presets:** Ein Preset kann `loop_*`-Verweise und Schleifen-Einstellungen tragen; die Baumprüfung erkennt Schleifen aus Presets nicht (fail closed). Auf der Website bleibt das ohne Wirkung (siehe 1).
- **Globale Module:** Der Inhalt eines globalen Eintrags hat keinen Schleifen-Kontext (`loop_*` im Eintrag wird abgelehnt). Eine globale Instanz in einer Schleife expandiert Divi vor der Schleifen-Phase (`BlockParser.php:917-924`); das Plugin sieht nur die lokalen Attribute der Instanz (Audit L3, offen).
- **Shortcodes und Bedingungen** in Term-/Benutzer-/Menü-Schleifen laufen gegen den Beitrag mit der Term-/Benutzer-ID (`LoopUtils.php:4507-4510`, Audit I5).
- **Rechte:** Schleifen über `attrs` können private Beiträge und Benutzerdaten ausgeben, wie im Divi-Builder; das Plugin verlangt dafür `list_users` (Benutzer) bzw. `read_private_posts` (`any`, `attachment`, leere `subTypes`; Audit L1, Option B).
*Fußnote: Alle Angaben gegen Divi 5.15.1 (Formate zuvor aus 5.2.1 und 5.14.0 geprüft; 5.15.1 maßgeblich).*