Skip to content

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/AbC123xyz0

WordPress ​

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 und style werden 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.

  1. Ordner integrations/wordpress/pollyou-oembed aus dem PollYou-Repository als ZIP packen und unter Plugins → Installieren → Plugin hochladen installieren (oder nach wp-content/plugins/ kopieren) und aktivieren.

  2. 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:

    php
    add_filter( 'pollyou_oembed_base_urls', fn () => array( 'https://umfragen.example.com' ) );
  3. 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 ​

UmfrageAntwort des Endpunkts
veröffentlicht: geplant, live oder geschlossenEinbettung (geschlossene zeigen Hinweis bzw. Ergebnisse)
unbekannt, Entwurf, archiviert404 – 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
ParameterBedeutung
urlDirektlink …/s/{id} oder Rahmenseite …/p/{id} derselben PollYou-Installation (Pflicht). theme, locale, hide_title, transparent und versteckte Felder aus der URL werden übernommen.
formatjson (Standard) oder xml; andere Formate: 501.
maxwidth, maxheightHö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
}
  • html enthält einen versteckten Link als Ersatz (für Systeme, die keine Rahmen erlauben, und für WordPress), den Rahmen der Rahmenseite und iframe-resizer.js fü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 fetch abfragen (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:

  1. Netz: eigenes Docker-Netz, z. B. docker network create pollyou-oembed-wp.

  2. 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; ohne variables_order=EGPCS ignoriert der eingebaute Server die Umgebungsvariablen), im Netz pollyou_default (Datenbank, Redis) und zusätzlich im WordPress-Netz mit dem Alias pollyou-backend, Port 8680 auf den Host veröffentlichen. EMBED_SCRIPT_URL auf einen eigenen Embed-CDN zeigen lassen (PORT=5380 node frontend/packages/embed-core/scripts/serve-cdn.mjs nach pnpm --filter @pollyou/embed-core build). Demo-Daten: bin/console doctrine:fixtures:load.

  3. WordPress: Images mariadb:11 und wordpress:6-php8.3-apache im WordPress-Netz, WordPress auf Port 8681; das Plugin-Verzeichnis integrations/wordpress/pollyou-oembed nach wp-content/plugins/ einbinden. Installation per WP-CLI (wordpress:cli, mit --volumes-from des WordPress-Containers): wp core install --url=http://localhost:8681 ….

  4. 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:

    php
    add_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.

  5. 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 eval mit apply_filters('the_content', …) zeigt das erzeugte HTML (ohne Plugin: sandbox="allow-scripts", data-secret, Link-Ersatz; mit Plugin: unverändertes HTML mit iframe-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.
  6. Aufräumen: alle Container mit docker rm -fv, das Netz mit docker network rm entfernen.

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.