RSS-Feeds mit dem News-Modul

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:

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.

<?php

    
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.

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