Mit WordPress einen Custom-Post-Type Podcast erstellen

Seit Version 3 unterstützt WordPress „Custom-Post-Types„, d.h. neben Artikeln, Seiten, Links und Anhängen können eigene Inhaltstypen definiert werden. Das hat mindestens zwei Vorteile. Dadurch das diese Inhaltstypen getrennt von Artikeln und Seiten sind muss man in seinen Themes nicht umständliche Konstruktionen entwerfen um z.B. Podcast-Einträge wieder von den Artikeln zu trennen – man hat einfache einen Inhaltstyp Podcast. Außerdem lassen sich für zusätzliche Inhaltstypen eigenständige Eingabemasken erstellen, so dass der Administrator bei der Eingabe dieser Einträge besser angeleitet wird.

Für die Internetseite einer christlichen Gemeinde habe ich die custom-post-type-Funktionalität genutzt um einen Podcast mit den letzten Predigten zu erstellen. Im Großen und Ganzen ist das Erstellen solcher spezifischen Inhaltstypen recht einfach, in der Dokumentation ist die Funktionalität mit Beispielen erklärt. Es gibt jedoch ein paar Ecken an denen es dennoch klemmt, eine möchte ich hier vorstellen.

Basics zu custom-post-types

Um einen Custom-Post-Type, also einen eigenen Inhaltstype, zu erstellen muss die Funktion „register_post_type“ verwendet werden. Hiermit habe ich den neuen Podcast-Inhaltstyp von „post“ abgeleitet. Außerdem habe ich festgelegt das nur Titel und Editor angezeigt werden sollen. Gute Tutorials zum grundlegenden Erstellen von Custom-Post-Types findet man im Codex, sowie hier und hier.

Um einen Audioplayer auf der Ausgabeseite einzubinden habe ich das Plugin „Audio player“ von Martin Laine genutzt. Durch das Plugin lässt sich folgender Shortcode im Editorfeld einbinden. An der Stelle an der dieser Codeschnipsel eingefügt wird, wird im veröffentlichten Eintrag dann ein Audio-Player erscheinen und das Abspielen direkt von der Website ermöglichen.

[ audio:<url>|<title>]

Hinweis: Vorsicht, das Audio-Player-Plugin unterstützt keine Umlaute.

Die Anzeige und Auflistung der Podcast-Einträge lässt sich relativ einfach bewerkstelligen (Tutorial hier). Womit es allerdings Probleme gab war der Podcast-Feed.

Problem mit der RSS-/Podcast-Funktionalität

Wesentlicher Bestandteil eines Podcasts ist die Möglichkeit ihn zu abonnieren und sich auf einem beliebigen Feed-Reader (z.B. IPhone, Google Reader, IPod, …) anhören zu können. Jedesmal wenn ein neuer Podcast-Eintrag veröffentlicht wird bekommen die Abonnenten diesen dann via RSS-Feed sofort zugestellt.

Damit die Einträge in einem RSS-Feed erscheinen habe ich einen Action-Hook in der Anfrage-Funktion genutzt.

[php]
//simple podcast functionality
//podcast avalable under /feed?sermons_podcast=1
function myfeed_request($arg) {
if (isset($arg[‚feed‘]) && !empty($_REQUEST[’sermons_podcast‘])) {
$arg[‚post_type‘] = array(’sermons‘);
}
return $arg;
}
add_filter(‚request‘, ‚myfeed_request‘);
[/php]

Die Funktion wird bei jeder Anfrage nach Einträgen ausgeführt und ermöglicht es die Anfrageparameter ($arg) zu verändern. Ich überprüfe in der Funktion ob gerade ein Feed angefragt wird. Wurde an die Feed-Url die Variable „sermons_podcast“ angehängt, lasse ich nur noch Einträge vom Typ „sermons“ ausgeben.

Soweit so gut, die Einträge sind nun unter „<url>/feed?sermons_podcast=1“ verfügbar, damit ein richtiger Podcast daraus wird, müssen die Audiodateien aber in einem bestimmten XML-Element (<enclosure url=““ lenght=““ type=“audio/mpeg“ />) des RSS-Feeds angegeben sein.

In normalen Artikeln nimmt WordPress diesen Eintrag selbstständig vor, bei Custom-Post-Types jedoch nicht. Ich musste lange suchen bis ich heraus bekam wie WordPress den Eintrag im RSS-Feed erstellt.

Beim Veröffentlichen eines Artikels überprüft WordPress standardmäßig ob im Eintrag auf eine Multimedia-Datei verlinkt wird. Wenn dem so ist wird ein Eintrag in den benutzerdefinierten Feldern (custom-post-data) des Eintrags hinterlassen, der die URL, die Länge und den Mime-Type der Datei in je einer Zeile enthält.

Bei der Ausgabe des Feeds überprüft WordPress dann ob eine Eintrag „enclosure“ in den benutzerdefinierten Feldern hinterlassen wurde und fügt bei Bedarf das XML-Element (siehe oben) ein. Alle gängigen Feed-Reader verstehen das enclosure-Element als abgehangene Datei und binden es mit einem ensprechendem Player ein.

Um die enclosure-Funktionalität auch in den Custom-Post-Types verfügbar zu machen nutzte ich die Standardfunktion und fügte sie beim Speichern von Custom-Post-Types ein.

[php]
/**
* enclosure-fix
* For some reason wordpress dont filter the enclosures out of custom post types and saved them into the meta.
* So we do that in the following lines.
*/
add_action(‚edit_post‘, ’sermons_enclosurefix‘);
add_action(’save_post‘, ’sermons_enclosurefix‘);
function sermons_enclosurefix($post_ID) {
global $post;
if($post->post_type==’sermons‘) {
do_enclose($post->post_content, $post->ID);
}
}
[/php]
Das dieser umständliche Weg überhaupt nötig ist verwundert mich etwas, denn der Podcasts ist eines der Standardbeispiel für Custom-Post-Types. Vielleicht wird die Funktionalität der Enclosures in Custom-Post-Types im kommenden WordPress 3.1 nachgerüstet.