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

5.0 KiB
Raw Permalink Blame History

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).