YouTube aus der oEmbed-Ausgabe anpassen und auf Nocookie umlenken

Seit der Version 3.6 enthält WordPress die Unterstützung der oEmbed-Schnittstelle.

Damit ist es möglich, durch die einfache Linksetzung zu YouTube und anderen unterstützten Portalen in Artikeln ein Embed zu gnerieren. In anderen Worten: Setze ich im Editor einfach einen Link zu YouTube, wird es dann später in der Ausgabe des Artikels richtig angezeigt. Ich brauche mich dann nicht mehr um irgendwelche HTML-Codes zu kümmern.

Das ist sehr komfortabel.

Die oEmbed-Schnittstelle funktioniert so, daß beim Aufruf des Artikels eine Anfrage bei dem Anbieter erfolgt, ob dieser einen Standard-HTML-Code hat für das Einbinden. Dieser HTML-Code wird dann entgegen genommen und im Artikel verwendet.
Der Haken daran ist: Man hat keinen Einfluß auf dieses HTML. (Wollte man ja auch nicht).  Will man aber das HTML anpassen (z.B. weil es nicht valide zum eigenen HTML ist oder weil es Probleme mit der Barrierefreiheit gibt), hat man eher schlechte Karten.

Es ist aber nicht unmöglich. Mit der Funktion wp_embed_register_handler und einem Filter, kann man die Ausgabe etwas verbessern.

In einem Anwendungsfall, gab es folgende Wünsche:

  1. Vor dem YouTube-Video soll dieses verlinkt werden. Dies deswegen, weil nicht sichergestellt wird, dass jeder das eingebettete Video wirklich anzeigen lassen konnte. Das Embed enthält zwar einen Link zur Quelle, aber wenn das ganze Embed nicht angezeigt werden kann, dann nutzt mir das gar nichts.
  2. Man kann Videos von YouTube auch über die Domain youtube-nocookie.com abrufen. Diese Domain unterscheidet sich von der normalen dadurch, daß keine Cookies gesetzt werden. (Das dies aus Sicht des Trackings nur eine Nebelkerze ist, ist ein anderes Thema)

Diese Wünsche erfordern, daß man das HTML welches von der oEmbed-Schnittstelle kommt, ignoriert und durch was anderes ersetzt. Ausserdem muss man dies mit einem Filter machen, damit die vorhandenen Definitionen überschrieben werden.

Zunächst registriere neue register_handler:

 wp_embed_register_handler( 'ytnocookie', '#https?://www\.youtube\-nocookie\.com/embed/([a-z0-9\-_]+)#i', 'wp_embed_handler_ytnocookie' );
 wp_embed_register_handler( 'ytnormal', '#https?://www\.youtube\.com/watch\?v=([a-z0-9\-_]+)#i', 'wp_embed_handler_ytnocookie' );
 wp_embed_register_handler( 'ytnormal2', '#https?://www\.youtube\.com/watch\?feature=player_embedded&v=([a-z0-9\-_]+)#i', 'wp_embed_handler_ytnocookie' );

Bedeutet grob gesagt: ich definiere, daß bei dem vorkommen verschiedener möglicher URLs auf YouTube eine eigene Funktion aufgerufen wird, nämlich wp_embed_handler_ytnocookie().

Diese Funktion sieht so aus:

function wp_embed_handler_ytnocookie( $matches, $attr, $url, $rawattr ) {
   global $defaultoptions;
   $relvideo = '';
   if ($defaultoptions['yt-norel']==1) {
       $relvideo = '?rel=0';
   }
   $embed = sprintf(
     '<div><p><img src="%1$s/images/social-media/youtube-24x24.png" width="24" height="24" alt="">YouTube-Video: <a href="https://www.youtube.com/watch?v=%2$s">https://www.youtube.com/watch?v=%2$s</a></p><iframe src="https://www.youtube-nocookie.com/embed/%2$s%5$s" width="%3$spx" height="%4$spx" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"></iframe></div>',
      get_template_directory_uri(),
      esc_attr($matches[1]),
      $defaultoptions['yt-content-width'],
      $defaultoptions['yt-content-height'],
      $relvideo
   );
   return apply_filters( 'embed_ytnocookie', $embed, $matches, $attr, $url, $rawattr );
 }

Im Array $defaultoptions hab ich dabei noch die Höhe und Breite des Embeddings angegeben und gebe auch an, ob ich am Ende des Videos weitere „relevante Videos“ angezeigt haben will oder nicht.