RSS-Feeds erstellen mit WebsiteBaker

Wer gern mit dem News-Modul des freien Content Management Systems „WebsiteBaker“ arbeitet und sich darüber einen RSS-Feed generieren lässt, kennt sicher das Problem: Der für das Generieren des Feed zuständigen Datei „rss.php“ wurde in den letzten Versionen des Moduls offenbar keine größere Beachtung geschenkt. Dadurch war der generierte Feed eigentlich nicht zu gebrauchen, da ihm wichtige Angaben fehlten. Schon vor etwas über zwei Jahren hatten Christian Badberg und ich einige Modifikationen an der Datei vorgenommen, um sie endlich benutzbar zu machen. Letzte Woche ist mir jedoch ein weiterer Fehler aufgefallen, den ich einer neuen Version der „rss.php“ behoben habe: Versieht man Einträge mit einem Start- und/oder Enddatum, wird der entsprechend Eintrag im Feed auch außerhalb des vorgegebenen Veröffentlichungszeitraums ausgegeben, was natürlich totaler Unsinn ist.

Jede größere Website hat sie, sie sind ein gutes Mittel zur Besucherbindung und informieren immer aktuell: RSS-Feeds

Wer in Website Baker Seiten vom Typ „News“ erstellt hat und dort Beiträge postet, kann diese recht einfach als RSS-Feeds verfügbar machen. Da ich an diversen Foren über die Frage stolper bin, wie denn das genau geht, möchte ich hier kurz das Verfahren vorstellen.

Wie es funktioniert

Alle im News-Modul erfassten Beiträge stehen automatisch als RSS-Feed zur Verfügung – es ist kein weiteres Zutun erforderlich. Die URL zum Feed lautet:

http://www.domainname.de/wb-verzeichnis/modules/news/rss.php?page_id=XX

Hier muss lediglich „domainname.de“ durch den Domainnamen der Site, „wb-Verzeichnis“ durch das Installationsverzeichnis von Websitebaker und „XX“ durch die Page-ID der News-Seite ersetzt werden.

Für meine Website sieht die URL dann so aus (vor dem Umstieg auf WordPress):

http://www.andreherdling.de/generator/modules/news/rss.php?page_id=10

Page-ID ermitteln

Die Frage, vor der ich zunächst stand, war „wo erfahre ich nötige Page-ID“. Das ist jedoch schnell erklärt: Klickt man im Backend im Menüpunkt „Seiten“ (Pages) auf die Newsseite, so wird die Page-ID in der Adresszeile des Browsers angezeigt. Also einfach diese Nummer notieren oder merken und in der oben genannten URL statt dem „XX“ einfügen.

RSS-Feed in Template einbinden

Damit nun das übliche RSS-Icon beim Besucher der Website in der Adressezeile angezeigt wird, muss nur noch der Pfad zum Feed im Template ergänzt werden. Hierzu wird folgendes im HEAD-Bereich des Quelltextes notiert:

<link rel="alternate" type="application/rss+xml" title="Mein RSS-Feed" href="http://www.domainname.de/wb-verzeichnis/modules/news/rss.php?page_id=XX" />

Wobei hier wieder die „domainname.de“, „wb-verzeichnis“ und „XX“ durch die individuellen Angaben ergänzt werden müssen. In meinem Fall sieht die Angabe dann so aus:

<link rel="alternate" type="application/rss+xml" title="andreherdling.de RSS-Feed" href="http://www.andreherdling.de/generator/modules/news/rss.php?page_id=10" />

Nun weiss der Browser des Besuchers, dass es einen Feed zur Site gibt und wo dieser zu finden ist.

Zu beachten! (nur WB 2.6.7 oder kleiner)

Website Baker ermöglich es, den standardmäßigen Seiten-Ordner mit dem Namen „pages“ zu verändern. Hierfür kann im Backend unter „Optionen“ ein anderer Seiten-Ordner angegben werden. Jedoch funktioniert die RSS-Ausgabe über „rss.php“ leider nicht mehr, wenn hier ein abweichender Ordner angeben ist, da „pages“ in „rss.php“ hartkodiert ist, sich also nicht dynamisch den persönlichen Einstellungen anpasst. Um dies zu Ändern ist ein Eingriff in die „rss.php“ nötig.

In Version 2.6.7 von Website Baker befindet sich diese Angabe in Zeile 94 und Zeile 95 der „rss.php“ – dort muss gegebenenfalls „pages“ durch den gewählten Alternativnamen ersetzt werden.

Ab Websitebaker 2.7 ist dieser Mangel behoben. Statt einem fest kodierten „pages“ ist dort nun die Konstante „PA­GES_­DI­REC­TO­RY“ hinterlegt, welche dynamisch den Namen des gewählten Seiten-Ordners übernimmt.

Verbesserter Feed-Generator

Christian Badberg beschreibt in seinem Blog wie man die Datei „rss.php“ erweitern muss, um den Feed-Items ein gültiges Publikations-Datum anzuhängen. Dieses ist Vorraussetzung für die Eintragung in diversen RSS-Katalogen und wird auch von RSS-Readern benötigt, um das Alter eines Beitrages korrekt anzuzeigen.

Er generiert zunächst ein RFC 2822 formatiertes Datum aus dem in der Datenbank hinterlegten Unix-Zeitstempel:

<?php

      //RFC 2822 formatiertes Datum genieren...
      $item_date = date("r",$item['posted_when'])

?>

Dieses formatierte Datum, wird dann wenige Zeilen später, in das Feed-Item eingefügt:

aus dem alten Code…

<title><![CDATA[<?php echo stripslashes($item["title"]); ?>]]></title>
 <description><![CDATA[<?php echo stripslashes($item["content_short"]); ?>]]></description>

…wird der neue Code

<title><![CDATA[<?php echo stripslashes($item["title"]); ?>]]></title>
 <pubDate><![CDATA[<?php echo $item_date; ?>]]></pubDate>
 <description><![CDATA[<?php echo stripslashes($item["content_short"]); ?>]]></description>

Statt die Zeit aus „posted_when“ zu generieren ($item_date = date(„r“,$item[‚posted_when‘])), kann man unter WB ab Version 2.7 auch „published_when“ ($item_date = date(„r“,$item[‚published_when‘])) verwenden. Wie Christian Badberg richtig schreibt, hat das einen entscheidenden Vorteil: Der Eintrag „published_when“ bleibt immer gleich, während sich „posted_when“ bei jeder Änderung am News-Eintrag mit ändert. Wenn man also in einem alten Eintrag einen kleinen Rechtschreibfehler korrigiert, rutscht dieser Eintrag wieder in der Zeitleiste nach oben. Das wird in den seltensten Fällen gewünscht sein.

Aber auch „published_when“ hat noch eine kleine Macke: Die Uhrzeit in dieser Spalte ist (als Unix-Zeitstempel) immer mit 0.00 Uhr notiert. Dieses läßt sich nach Christians Angaben zwar durch manuelles Setzen des Veröffentlichungsdatums im WB-Backend beheben, allerdings müsste man das dann einmal für alle alten Einträge vornehmen.

Damit ich das umgehen kann, habe ich folgenden automatischen Workaround gefunden:
Ich erzeuge Veröffentlichungsdatum- & -zeit nicht aus „posted_when“ ODER „published_when“ sondern ziehe beide Spalten als Informationsquelle heran. Dabei verwende ich das Datum von „published_when“ und die Uhrzeit von „posted_when„. Die Uhrzeit von „posted_when“ ändert sich zwar auch mit jeder Änderung am News-Eintrag aber das ist nicht so tragisch wie die Änderung des Datums. Finde ich.

Sofern im Backend manuell eine Veröffentlichungszeit festgelegt wurde (die NICHT 0.00 Uhr ist), so wird diese Zeit verwendet.

 if(date("h:i", $item['published_when']) == '12:00') {
		//wenn 'published_when' nicht manuell geändert wurde (Zeit = '12:00')
		//neuen Zeitstempel mit dem Datum aus 'published_when' und der Uhrzeit von 'posted_when' erzeugen
		$newdateandtime = date("d F  Y", $item['published_when']).' '.date("h:i A", $item['posted_when']);
		$newdateandtime = strtotime($newdateandtime);
		$item_date = date("r",$newdateandtime);
	} else {
		//wenn 'published_when' von Hand geändert wurde (über das Backend)
		//Datum und Zeit so lassen, wie in 'published_when' hinterlegt
		$item_date = date("r",$item['published_when']);
	};

Und weil ich einmal dabei war, die „rss.php“ zu ändern, habe ich auch gleich noch eine Änderung vorgenommen, auf die mich Christian Pfitzmann aufmerksam hat: Die Reihenfolge der Items im Feed wird mitunter falsch ausgegeben. Die Lösung des Problems kannte WB-Großmeister Cio Mais­riml:

In der SQL-Query muss das Kommando „ORDER BY posted_when“ durch „ORDER BY position“ ersetzt werden.

Update 30.09.2010

Wenn man das Veröffentlichungsdatum eines Newseintrages händisch auf einen Termin in der Zunkft geändert hatte, erschien der Eintrag bislang dennoch im RSS-Feed. Und auch wenn ein Ablaufdatum angegeben wurde, stand der Eintrag anschiessend noch im Feed zur Verfügung. Damit dies nicht geschieht, habe ich erneut die Datei modifiziert: Vor der Ausgabe jedes Eintrages in den Feed wird nun geprüft, ob sich das aktuelle Datum (Zeitstempel) zwischen Start- und Enddatum des Eintrages befindet. Erst wenn diese Bedingung erfüllt ist, wird der Eintrag ausgegeben.

Update 17.03.2011

In den Kommentaren hatte Sven geschrieben, dass die modifizierte Datei bei Ihm nicht funktioniert. Wie sich während unseres Austausches via eMail herausstellte, verwendet er in einem Kundenprojekt Websitebaker 2.8.1 Rev. 1287. Daraufhin habe ich die Datei sowohl auf meinem Testsytem als auch in Kundenprojekten getestet – ohne Probleme. Ich konnte die Ursache des Fehlers in seinem Fall also leider nicht nachvollziehen. Da mich das geschilderte Problem dennoch beschäftigt hat, habe ich die rss.php aus dem derzeit aktuellen Download-Paket von websitebaker.org entnommen und meine Funktion zum ergänzen des Veröffentlichungsdatums dort eingesetzt. Bei Sven funktionierte daraufhin alles prima – und auf meinem Testsystem lief es auch.
Für WebsiteBaker-Installationen ab 2.8.1 Rev 1287 sollte daher die neue Datei „rss2.php“ verwendet werden, auch wenn in meinen Tests die „alte“ Datei ebensogut funktionierte.

DOWNLOAD DER GEÄNDERTEN RSS.PHP

Die folgende Datei funktioniert nur unter Website Baker ab Version 2.7. Website Baker 2.6.7 nutzt KEINE Spalte namens „published_when„. Bitte nicht unter Versionen vor 2.7 installieren! Und Backup nicht vergessen!

rss.php herunterladen (für WebsiteBaker 2.7. bis 2.8)

rss2.php herunterladen (für WebsiteBaker ab 2.8.1 Rev 1287)

4 Kommentare Schreibe einen Kommentar

  1. Hi André,
    zunächst vielen Dank für die ausführlichen Erläuterungen auf dieser Seite – so war es mir vergönnt innerhalb kürzester Zeit von „fast keine Ahnung wie das mit den RSS-Feeds funktioniert“ zu einer soweit funktionierenden Lösung zu kommen. Suppi! :-)
    Ein paar kleine Unsicherheiten sind jedoch noch verblieben, daher habe ich noch Fragen:
    a) RSS-Feed in Template einbinden – in welche Seite des Templates sollte der Aufruf
    link rel=“alternate“ type=“application/rss+xml“ title=“Mein RSS-Feed“ …
    am sinnigsten eingesetzt werden?
    b) Der Link auf unserer Seite (http://www.spilbulu.de/modules/news/rss.php?page_id=12) kann zwar vom Firefox und IE als Newsfeed erkannt werden, nicht jedoch von Safari unter iOS8.1
    Wenn ich mir andere RSS-Feeds im Netz so ansehe (z.B. die vom Heise-Verlag) generieren die dort Links in einem xlm bzw. rdf-Format. Diese können problemlos von iOS/Safari als Podcast interpretiert werden. Geht das auch mit Websitebaker? Wo liegt da ggf. mein Fehler?
    Irgendwie scheint mir das jedenfalls noch nicht ganz rund zu sein…

    Ich hoffe Du kannst mir ggf. weiterhelfen, herzlichen Dank für Deine Bemühungen vorab und
    beste Grüße aus dem Hessenland,
    Andi

    • Hallo Andi,
      vielen Dank für die Lorbeeren!

      Gern beantworte ich Deine offenen Fragen:
      a) Der Code gehört in die index.php des Templates. Damit steht die Angabe des Feeds auf jeder einzelnen Seite der Website zur Verfügung. Nutzer, die Deinen Feed abonnieren möchten, können dann einfach jede x-belibeige URL Deiner Site in Ihren Feed-Reader eintragen und dieser findet dort dann den Hinweis auf die Feed-URL.

      b) Wenn ich unter iOS 8.1.3 den Link anklicke, öffnet sich bei mir die Podcast-App. Der Feed wird also formell korrekt erkannt. Dass die Podcast-App allerdings keine Inhalte anzeigt, liegt sicher daran, dass es kein Podcast-Feed ist. In diesen gibt es nämlich ein Enclosure mit einer Audio-Datei – in einem „normalen“ Text-News-Feed aber nicht. Um den Feed zu prüfen, solltest Du einen RSS-Feed-Reader verwenden (ich nutze unter iOS die App „Reeder“ aber es gibt sicher gibt es da auch kostenfreie Alternative, wenn es Dir nur um das Testen geht).

      Falls Du noch weitere Fragen hast, stehe ich gern zu Deiner Verfügung!
      Übrigens: Eine interessante Site hast Du da und vor allem ein interessantes Buch – werde ich für meinen Sohn in enge Erwägung ziehen :-)

      Beste Grüße
      André

  2. Schöne Anpassung, genau das, was ich gesucht habe. Leider gibt der Feed nur den Kurztext mit Link zum kompletten Beitrag aus. Könnte man das noch modifizieren, sodass der komplette Beitrag im RSS Feed enthalten ist?

Schreibe einen Kommentar