Categories
Dev

RSS Feed mit PHP bauen5 min read

Disclaimer: This is a new version of my RSS Feed Turorial from 2008, as it still gets a decent amount of traffic from Google. Hope it still helps 15 years later.

Einen RSS Feed kann man kinderleicht für seine dynamische Website, zum Beispiel ein News Script, erstellen. Dafür ist nur die Kenntnis vom Aufbau einer RSS Datei plus eine einfache Datenbankabfrage notwendig. Hier wird gezeigt wie man einen solchen dynamische generierten RSS Feed manuell zusammenstellt.

Einleitung

Als Vorwissen für dieses Tutorial benötigt man Kenntnisse in php und mysql. Ziel ist es ein kleines php Script zu schreiben, das auf Basis von Daten aus einer mysql o.ä. Datenbank dynamisch einen RSS Feed generiert.

Zuerst muss man sich entscheiden auf welchen RSS Standard man zurück greifen will. Es gibt diverse Standards, die man auch gängig bei anderen Seiten finden kann – zB. RSS0.91, RSS1.0 und RSS2.0 (mehr dazu hier). Wir werden in diesem Tutorial einen RSS2.0 Feed erstellen.

Dokument Definition

Als erstes erstellen wir in einem Editor eine leere Datei und fügen folgenden Header Code in die ersten Zeilen ein:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<rss version="2.0"> 
<channel> 

Hier wird erstmal definiert um was für ein Dokument es sich hier eigentlich handelt bzw. die XML DTD dazu bestimmt. Die Tags “<rss>” und ” <channel>” sind die Basis Element eines RSS Feeds. Da wir einen Dynamischen RSS Feed haben wollen und die erstellende Datei eine php Script beinhaltet, muss die erste Zeile, die XML Definition, mit einem echo ausgegeben werden, da sonst der php Interpretor auf das “?” mit einem Parse Error reagiert.

<?xml version="1.0" encoding="ISO-8859-1" ?>" 

Weiters muss hier dem Browser der content type mitgeteilt werden, da dieser sonst den Inhalt als Html und icht als xml ausgibt. Die ganze veränderte Zeile sieht dann wie folgt aus:

<?php header("Content-type: text/xml"); 
echo "<?xml version="1.0" encoding="ISO-8859-1" ?>"; ?>

Meta Daten

Nachdem wir nun die Stammelemente plus die xml Definition erstellt haben machen wir uns an die Meta Daten des Feeds. Die sehen bei RSS2.0 folgendermaßen aussehen und sind meistens statisch. Die Elemente hier sind selbsterklärend. Beim Tag “lastBuildDate” könnte man zum Beispiel mit <?php $now = time(); echo $now; ?> zur Script Laufzeit das aktuelle Datum einsetzen.

<title>Website name</title>
<link>http://www.beispiel.de</link>
<description>Beschreibung von Website</description>
<language>de-de</language>
<pubDate>Datum der Erstellung</pubDate>
<lastBuildDate>Datum des letzten Outputs, in vielen Fällen die Ausführzeit des Scriptes</lastBuildDate>
<docs>http://www.beispiel.to/rss.php</docs>
<generator>Rss Feed Engine</generator>
<managingEditor>info@beispiel.de</managingEditor>
<webMaster>info@beispiel.de</webMaster>

Elemente

Nun da die Meta Elemente ausgefüllt sind ist der nächste Schritt die einzelnen News Elemente des z.B. News Scipts in RSS konforme Daten zu konvertieren. Die Struktur eines Items sieht dabei so aus. Ein Feed kann beliebig viele Items beinhalten aber es macht Sinn diese auf ca. 10-20 Elemente zu beschränken.

<item>
<title>Beispiel Titel</title>
<link>http://www.beispiel.de/link</link>
<description>Beispiel Beschreibung, Text, Bilder etc. Die Description kann auch einen Excerpt (Auszug) des vollen Beitragtextes enthalten.</description>
<pubDate>Datum der Veröffentlichung des Beitrags</pubDate>
<guid>http://www.beispiel.de/link</guid>
</item>

Dieses Template eines Items füllen wir nun mittels einer Datenbank Abfrage o.ä. mit Daten. Der dazu passende Code könnte z.B. so aussehen:

<?php require('mysql_connect.php'); 
$SqlSelect = "SELECT link, pic, titel, text FROM news LIMIT 0,20"; 
$result = mysql_query($SqlSelect); 
if (!$result) { die('Invalid query: ' . mysql_error()); } 

while ($row = mysql_fetch_assoc($result)) { ?> 
<item> 
<title><?php echo $row['titel']; ?></title> 
<link> <?php echo $row['link']; ?> </link> 
<pubDate> Wenn vorhanden Timestamp des Beitrages, ansonst einfach weg lassen </pubDate> 
<description> <?php echo "<img src=\"".$row['pic']."\"></img></a>"; ?> <?php echo $row['text']; ?> </description> 
</item> <?php } 
mysql_free_result($result); 
mysql_close($dbh); 
?>

Zum Schluss schließen wir noch die beiden Stammelemente channel und rss am Ende des Dokumentes.

</channel>
</rss>

Um jetzt den erstellten Dynamischen RSS Feed auf der Hauptseite einzufügen und ihn für die Browser erkennbar zu machen, muss man foolgende Zeile in den Kopf der Hauptseite schreiben:

<link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.beispiel.de/rss.php" />

Hier die fertigen Datei:

<?php header("Content-type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>"; ?>
<rss version="2.0">
<channel> 
	<title>Website name</title>
	<link>http://www.beispiel.de</link>
	<description>Beschreibung von Website</description>
	<language>de-de</language>
	<pubDate>Datum der Erstellung</pubDate>
	<lastBuildDate>Datum des letzten Outputs, in vielen Fällen die Ausführzeit des Scriptes</lastBuildDate>
	<docs>http://www.beispiel.to/rss.php</docs>
	<generator>Rss Feed Engine</generator>
	<managingEditor>info@beispiel.de</managingEditor>
	<webMaster>info@beispiel.de</webMaster>

<?php
require('mysql_connect.php');

$SqlSelect = "SELECT link, pic, titel, text FROM news LIMIT 0,20";
	$result = mysql_query($SqlSelect);

	if (!$result)	{	    die('Invalid query: ' . mysql_error());	}
	
	while ($row = mysql_fetch_assoc($result))	{
	
?>
	<item>
	<title><?php echo $row['titel']; ?></title>	
	<link>
	<?php echo $row['link']; ?>
	</link>	
	<pubDate>
	Wenn vorhanden Timestamp des Beitrages, ansonst einfach weg lassen
	</pubDate>
	<description>
	<?php echo "<img src=\"".$row['pic']."\"></img></a>"; ?>
	<?php  echo $row['text']; ?>
	</description>
	</item>

<?php
	}
mysql_free_result($result);
mysql_close($dbh);
?>

</channel>
</rss>

Leave a Reply

Your email address will not be published. Required fields are marked *