Appearance
oEmbed und WordPress
PollYou unterstützt oEmbed. Systeme, die oEmbed kennen – WordPress, Ghost, Discourse, Notion-ähnliche Editoren, Iframely/Embedly –, machen aus einem eingefügten Umfrage-Link automatisch die eingebettete Umfrage. Es genügt, den Direktlink einzufügen:
https://app.pollyou.org/s/AbC123xyz0WordPress
Ohne Plugin
Fügen Sie den Direktlink in einen Beitrag ein:
- Block-Editor (Gutenberg): Link in einen leeren Absatz einfügen – WordPress macht daraus einen Embed-Block mit der Umfrage.
- Klassischer Editor: Link allein in eine eigene Zeile schreiben.
Das funktioniert ohne Plugin, weil die Direktlink-Seite ihren oEmbed-Endpunkt per Discovery-Tag bekannt gibt. WordPress behandelt PollYou dabei aber wie jeden unbekannten Anbieter (Funktion wp_filter_oembed_result):
- Vom HTML der Antwort bleiben nur
<iframe>,<blockquote>und<a>übrig, Scripts undstylewerden entfernt. - Der Rahmen bekommt
sandbox="allow-scripts": Die Umfrage läuft ohne eigene Origin – kein Browser-Speicher (die Mehrfachabstimmungs-Sperre „Gerät“ und das Fortsetzen nach einem Reload wirken dort nicht), keine Weiterleitung nach der Teilnahme, keine Popups. - Die Höhe passt WordPress selbst an (Skript
wp-embed, Nachricht mit einem Geheimnis aus#?secret=…), allerdings nur zwischen 200 und 1000 Pixeln. Die Rahmenseite unterstützt dieses Protokoll. - Bis der Rahmen sich meldet, zeigt WordPress einen Link „Titel der Umfrage“ zum Direktlink – auch dann, wenn der Rahmen gar nicht geladen werden kann.
Abstimmen und Ergebnisse funktionieren auch im Sandbox-Rahmen.
Mit dem Plugin „PollYou Embeds“ (empfohlen)
Das Plugin trägt PollYou als vertrauenswürdigen oEmbed-Anbieter ein (wp_oembed_add_provider). WordPress übernimmt das HTML dann unverändert, wie bei YouTube oder Vimeo: kein Sandbox-Rahmen, automatische Höhe ohne Grenze (iframe-resizer.js), alle Schutzmechanismen und Weiterleitungen wie auf anderen Seiten. Außerdem fragt WordPress den Endpunkt direkt ab, ohne vorher die Direktlink-Seite zu laden.
Ordner
integrations/wordpress/pollyou-oembedaus dem PollYou-Repository als ZIP packen und unter Plugins → Installieren → Plugin hochladen installieren (oder nachwp-content/plugins/kopieren) und aktivieren.Eigene PollYou-Installation: unter Einstellungen → Schreiben → „PollYou instances“ die Basis-URL eintragen (eine pro Zeile, Standard
https://app.pollyou.org). In Code geht das auch per Filter:phpadd_filter( 'pollyou_oembed_base_urls', fn () => array( 'https://umfragen.example.com' ) );Bereits eingebettete Links nutzen den neuen Anbieter, sobald der oEmbed-Cache abläuft (WordPress: ein Tag) oder der Beitrag erneut gespeichert wird;
wp embed cache clear <Beitrags-ID>leert ihn sofort.
Das Plugin steht unter der GPL 2.0 (oder später), wie WordPress selbst.
Welche Umfragen sich einbetten lassen
| Umfrage | Antwort des Endpunkts |
|---|---|
| veröffentlicht: geplant, live oder geschlossen | Einbettung (geschlossene zeigen Hinweis bzw. Ergebnisse) |
| unbekannt, Entwurf, archiviert | 404 – WordPress lässt den Link als Link stehen |
| alle Embed-Konfigurationen auf bestimmte Origins beschränkt, oder Mehrfachabstimmungs-Sperre „Identität“/„Login“ | 401 – nicht einbettbar |
oEmbed-Anbieter wissen nicht, auf welcher Website das HTML landet. Eine Umfrage, die nur auf bestimmten Seiten laufen darf, liefert deshalb kein oEmbed – betten Sie sie dort per iframe oder Script ein. Bei einem Link auf die Rahmenseite (/p/AbC123xyz0?embed=…) gilt die genannte Embed-Konfiguration: uneingeschränkt und ohne „signierte Identität“ ist sie einbettbar. Die Direktlink-Seite enthält das Discovery-Tag nur, wenn die Umfrage einbettbar ist.
Antworten über oEmbed zählen in der Auswertung unter dem Kanal iframe.
Der oEmbed-Endpunkt
GET https://app.pollyou.org/oembed?url=https%3A%2F%2Fapp.pollyou.org%2Fs%2FAbC123xyz0&format=json&maxwidth=600| Parameter | Bedeutung |
|---|---|
url | Direktlink …/s/{id} oder Rahmenseite …/p/{id} derselben PollYou-Installation (Pflicht). theme, locale, hide_title, transparent und versteckte Felder aus der URL werden übernommen. |
format | json (Standard) oder xml; andere Formate: 501. |
maxwidth, maxheight | Höchstmaße in Pixeln; ohne Angabe 640 × 480. |
Antwort (type: "rich"; bei White-Label ist provider_name der Anzeigename der Organisation):
json
{
"type": "rich",
"version": "1.0",
"title": "Wohin geht der Teamausflug?",
"provider_name": "PollYou",
"provider_url": "https://app.pollyou.org",
"cache_age": 3600,
"html": "<blockquote style=\"display: none\"><a href=\"https://app.pollyou.org/s/AbC123xyz0\">Wohin geht der Teamausflug?</a></blockquote><iframe src=\"https://app.pollyou.org/p/AbC123xyz0\" width=\"600\" height=\"480\" title=\"Wohin geht der Teamausflug?\" loading=\"lazy\" …></iframe><script src=\"https://embed.pollyou.org/v1/iframe-resizer.js\" async></script>",
"width": 600,
"height": 480
}htmlenthält einen versteckten Link als Ersatz (für Systeme, die keine Rahmen erlauben, und für WordPress), den Rahmen der Rahmenseite undiframe-resizer.jsfür die automatische Höhe.Fehler: 400 ohne
url, 404 für fremde oder unbekannte URLs, 401 für nicht einbettbare Umfragen (siehe oben), 501 für andere Formate – jeweils mit kurzem Text.Jede Origin darf den Endpunkt per
fetchabfragen (Access-Control-Allow-Origin: *).Discovery auf der Direktlink-Seite:
html<link rel="alternate" type="application/json+oembed" href="https://app.pollyou.org/oembed?url=…&format=json" title="…" /> <link rel="alternate" type="text/xml+oembed" href="https://app.pollyou.org/oembed?url=…&format=xml" title="…" />
Die URL muss auf denselben Host zeigen wie der Endpunkt. Bei eigenen Domains beantwortet die Domain selbst die oEmbed-Anfragen: Ein eingefügter Link https://umfrage.deine-firma.de/s/… verweist per Discovery auf https://umfrage.deine-firma.de/oembed.
Selbst testen (Entwicklung)
So wurde die Einbettung mit einem echten WordPress (6.9) geprüft – alles in Docker, getrennt vom übrigen Entwicklungs-Stack:
Netz: eigenes Docker-Netz, z. B.
docker network create pollyou-oembed-wp.PollYou-Backend: das Backend des Arbeitsstands in einem PHP-Container mit dem eingebauten Server starten (
php -d variables_order=EGPCS -S 0.0.0.0:8680 -t public public/index.php; ohnevariables_order=EGPCSignoriert der eingebaute Server die Umgebungsvariablen), im Netzpollyou_default(Datenbank, Redis) und zusätzlich im WordPress-Netz mit dem Aliaspollyou-backend, Port 8680 auf den Host veröffentlichen.EMBED_SCRIPT_URLauf einen eigenen Embed-CDN zeigen lassen (PORT=5380 node frontend/packages/embed-core/scripts/serve-cdn.mjsnachpnpm --filter @pollyou/embed-core build). Demo-Daten:bin/console doctrine:fixtures:load.WordPress: Images
mariadb:11undwordpress:6-php8.3-apacheim WordPress-Netz, WordPress auf Port 8681; das Plugin-Verzeichnisintegrations/wordpress/pollyou-oembednachwp-content/plugins/einbinden. Installation per WP-CLI (wordpress:cli, mit--volumes-fromdes WordPress-Containers):wp core install --url=http://localhost:8681 ….Nur für den Test: WordPress lädt oEmbed-Daten mit
wp_safe_remote_get, das private IP-Adressen (das Docker-Netz) und andere Ports als 80/443/8080 ablehnt. Ein Must-Use-Plugin erlaubt genau den Test-Host:phpadd_filter( 'http_request_host_is_external', fn ( $external, $host ) => $external || 'pollyou-backend' === $host, 10, 2 ); add_filter( 'http_allowed_safe_ports', fn ( $ports ) => array_merge( $ports, array( 8680 ) ) );Im Betrieb ist das nicht nötig: PollYou läuft unter einem öffentlichen Host mit HTTPS.
Prüfen:
- Beitrag mit nur dem Link anlegen:
wp post create --post_content="http://pollyou-backend:8680/s/<id>" --post_status=publish, außerdem einen Beitrag mit Embed-Block (<!-- wp:embed {"url":"…"} -->). wp evalmitapply_filters('the_content', …)zeigt das erzeugte HTML (ohne Plugin:sandbox="allow-scripts",data-secret, Link-Ersatz; mit Plugin: unverändertes HTML mitiframe-resizer.js).- Den Editor-Weg prüft eine REST-Anfrage an
/oembed/1.0/proxy?url=…als Administrator. - Im Browser (Playwright/Chromium mit
--host-resolver-rules=MAP pollyou-backend 127.0.0.1) den Beitrag öffnen, abstimmen und prüfen, dass die Ergebnisse erscheinen und sich die Höhe anpasst.
- Beitrag mit nur dem Link anlegen:
Aufräumen: alle Container mit
docker rm -fv, das Netz mitdocker network rmentfernen.
Ergebnis des Tests: In allen drei Varianten (klassischer Editor und Block-Editor ohne Plugin, klassischer Editor mit Plugin) erschien die Umfrage, die Abstimmung wurde gespeichert, die Ergebnisse wurden angezeigt und der Rahmen passte seine Höhe an.