WordPress: Eigenen oEmbed-Provider registrieren

Wer einen eigenen Provider für oEmbed (siehe codex) registrieren möchte, ist relativ schnell am Ziel. Doch was ist das eigentlich?

oEmbed ist ein offenes Format, welches erlaubt, Daten in eine andere Webseite einzubetten. Dazu braucht man die Struktur der Daten nicht genau kennen. Alles was man braucht, ist ein Link zu einer Ressource. Das Ergebnis ist dabei immer gleich aufgebaut. Einziger Unterschied eventuell das Format – hier wird immer XML und JSON unterstützt.

Beispiele

So sieht ein oEmbed-Request zu Flickr beispielsweise so aus:

https://www.flickr.com/services/oembed/?url=http%3A//www.flickr.com/photos/klein0r/8668775994/

Der entsprechende Response sieht so aus:

<oembed>
	<type>photo</type>
	<title>Flower</title>
	<author_name>klein0r Photography</author_name>
	<author_url>https://www.flickr.com/photos/klein0r/</author_url>
	<width>1024</width>
	<height>683</height>
	<url>https://farm9.staticflickr.com/8522/8668775994_3bf011b197_b.jpg</url>
	<web_page>https://www.flickr.com/photos/klein0r/8668775994/</web_page>
	<thumbnail_url>https://farm9.staticflickr.com/8522/8668775994_3bf011b197_s.jpg</thumbnail_url>
	<thumbnail_width>75</thumbnail_width>
	<thumbnail_height>75</thumbnail_height>
	<web_page_short_url>https://flic.kr/p/ed2K65</web_page_short_url>
	<license>All Rights Reserved</license>
	<license_id>0</license_id>
	<version>1.0</version>
	<cache_age>3600</cache_age>
	<provider_name>Flickr</provider_name>
	<provider_url>https://www.flickr.com/</provider_url>
</oembed>

Wenn man das nun mit einem Ergebnis von Youtube vergleicht, unterscheiden sich die Ergebnisse nicht besonders:

http://www.youtube-nocookie.com/oembed?url=https://www.youtube-nocookie.com/watch?v=YthYk__gHOw

Nur dass hier JSON im Standard geliefert wird.

{
	author_name: "klein0r.de",
	html: "<iframe width="459" height="344" src="http://www.youtube-nocookie.com/embed/YthYk__gHOw?feature=oembed" frameborder="0" allowfullscreen></iframe>",
	thumbnail_height: 360,
	thumbnail_width: 480,
	title: "klein0r Photography - Mein 2013",
	provider_url: "http://www.youtube-nocookie.com/",
	type: "video",
	height: 344,
	provider_name: "YouTube",
	author_url: "http://www.youtube-nocookie.com/user/klein0rde",
	thumbnail_url: "http://i.ytimg.com/vi/YthYk__gHOw/hqdefault.jpg",
	width: 459,
	version: "1.0"
}

Bei Twitter sieht es ebenfalls so aus:

https://api.twitter.com/1/statuses/oembed.json?url=https://twitter.com/klein0r/status/494053631872618496

Ergebnis:

{
	cache_age: "3153600000",
	url: "https://twitter.com/klein0r/statuses/494053631872618496",
	height: null,
	provider_url: "https://twitter.com",
	provider_name: "Twitter",
	author_name: "Matthias Kleine",
	version: "1.0",
	author_url: "https://twitter.com/klein0r",
	type: "rich",
	html: "<blockquote class="twitter-tweet"><p>OpenSSL unter MAMP nutzen <a href="http://t.co/331Yhr7COp">http://t.co/331Yhr7COp</a></p>— Matthias Kleine (@klein0r) <a href="https://twitter.com/klein0r/statuses/494053631872618496">July 29, 2014</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>",
	width: 550
}

Weitere Parameter

Zusätzlich können weitere Parameter wie maxwidth und maxheight übergeben werden. So kann dem Provider mitgeteilt werden, wieviel Platz zur Verfügung steht. Der Parameter format beschreibt, in welchem Format man das Ergebnis erwartet. Dazu muss man sagen, dass einige Provider den Parameter format ignorieren und je Format zwei verschiedene Endpunkte zur Verfügung stellen.

Verwendung in WordPress

In WordPress wurde dieser Standard schon komplett implementiert. Die gängigsten Provider sind auch bereits im Standard hinterlegt und funktionieren ohne weitere Konfiguration. Möchte man nun einen eigenen Dienst anbinden, muss man sich an ein paar Events hängen, um den eigenen Provider zu registrieren.

Den besten Einstieg bietet sicherlich die Klasse WP_oEmbed (wp-includes/class-oembed.php). In der Datei stehen folgende Filter zur Verfügung:

  • oembed_providers
  • oembed_result
  • oembed_linktypes
  • oembed_fetch_url
  • oembed_dataparse

Der kompliziertere Part ist sicherlich die Implementierung von oEmbed auf der eigenen Serverseite. Aber auch das ist dank dem relativ einfach gestalteten Standard nicht sehr kompliziert. Das entsprechende WordPress-PlugIn ist dank der vorhanden Klasse schnell geschrieben.

Da nicht jeder Dienst eine oEmbed-Schnittstelle anbietet, holen dies andere Dienste wie noembed oder embed.ly nach.

Tests / Cache

Es ist darauf zu achten, dass WordPress die Ergebnisse der Services speichert. So werden nicht bei jedem Post-Aufruf die Services erneut aufgerufen. Problematisch ist das, wenn man viel ausprobieren möchte. Falls man die gespeicherten Daten löschen möchte, um den Request zu erzwingen, muss man die folgenden Einträge in der DB löschen:

  • Tabelle: wp_postmeta
  • Suche: meta_key LIKE ‚%_oembed%‘

All diese Einträge können bedenkenlos gelöscht werden.

oEmbed-Cache


Beitrag veröffentlicht

in

, , ,

von

Schlagwörter: