# 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_` | 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__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).*