Создаем RSS ленту

RSS ленты стали очень распространенным способом узнать об обновлении того или иного сайта. Сейчас практически на любом сайте есть такая лента, как сделать её на своем сайте посредством PHP я сейчас расскажу.

 

RSS (Really Simple Syndication (RSS 2.x))— XML-файл, предназначенный для описания лент новостей, анонсов статей, изменений в блогах и т. п..

 

Вот лента моего сайта:

 

<?xml version="1.0" encoding="windows-1251" ?>

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title><![CDATA[7ion blog]]></title>

<category><![CDATA[Разработка программного обеспечения]]></category>

<link>http://7ion.ru</link>

<copyright>© 7ion.ru 2009</copyright>

<description><![CDATA[7ion blog]]></description>

<lastBuildDate>Mon, 14 Jun 2010 11:16:47 +0300</lastBuildDate>

<language>ru</language>

<pubDate>Mon, 14 Jun 2010 11:16:47 +0300</pubDate>

<docs>http://blogs.law.harvard.edu/tech/rss</docs>

<managingEditor>Spin7ion@mail.ru (Alexander Semion)</managingEditor>

<webMaster>Spin7ion@mail.ru (Alexander Semion)</webMaster>

<item>

<title><![CDATA[Простая защита от MySQL injection]]></title>

<link>http://7ion.ru/index.php?q=news&amp;a=14</link>

<description><![CDATA[MySQL инъекции очень распространенная и наиболее опасная ошибка. С её помощью можно сделать много пакостей: от неавторизованного входа, до дефейса. Данная уязвимость позволяет злоумышленику выполнять произвольные команды на сервере базы данных.

О предмете статьи написанно много, часто пишут о фильтрации переменных регулярными выражениями кои просто увеличивают время обработки, я расскажу вам о самом простом и наиболее безопасном способе защиты.]]></description>

<category><![CDATA[Разработка программного обеспечения]]></category>

<pubDate>Wed, 02 Jun 2010 13:38:18 +0300</pubDate>

<guid>http://7ion.ru/index.php?q=news&amp;a=14</guid>

</item>

</channel>

</rss>

 

 

RSS фид состоит из нескольких основных тегов:

 

<rss> - обязательный тег, обозначает границы ленты

<channel> - обязательный тег, обозначает границы канала, в одной ленте может быть несколько каналов

<title>-заголовок ленты или анонса

<category>-категория анонса

<link>-ссылка на страницу где находится анонс

<copyright>-кому принадлежит фид

<description>-описание ленты или текст анонса

<lastBuildDate>-дата последнего создания

<language>- язык ленты

<pubDate>-дата публикации

<item>-обязательный тег, обозначает границы анонса

 

Вы наверное заметили конструкцию <![CDATA[SomeText]], она позволяет вставлять тексты на нестандартных языках и теги

 

Для создания ленты я использую класс найденный на просторах гугля, и немного подредактированный мной для прохождения валидности.

 

 

class CRss
{
var $Title; // заголовок канала
var $Link; // ссылка на главную страницу
var $Copyright; // копирайт
var $Description; // описание канала
var $LastBuildDate; // дата последней сборки документа (по умолчанию текущая)
var $Language; // язык
var $PubDate; // дата публикации
var $ManagingEditor; // редактор
var $WebMaster; // вебмастер
var $Category; // категория канала

function Translate($text) // кодируем для вывода в поток
{
$text=stripslashes($text);
$text=strip_tags($text,"<img><b><br><h1><a><object><param><embed>");//мы оставим только некоторые теги 

return $text;
}

function PrintHeader() // печать заголовка
{
header("Content-Type: application/rss+xml "); // сразу говорим, что это формат rss и XML
$RN="rn";//каждый тег отделяется переводом строки
$End="?";

print "<$End";
print "xml version="1.0" encoding="windows-1251" $End>$RN";
print "<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">$RN";
print " <channel>$RN";
print " <title><![CDATA[$this->Title]]></title>$RN";
print " <category><![CDATA[$this->Category]]></category>$RN";
print " <link>$this->Link</link>$RN";
print " <copyright>$this->Copyright</copyright>$RN";
print " <description><![CDATA[$this->Description]]></description>$RN";
print " <lastBuildDate>$this->LastBuildDate</lastBuildDate>$RN";
print " <language>$this->Language</language>$RN";
print " <pubDate>$this->PubDate</pubDate>$RN";
print " <docs>http://blogs.law.harvard.edu/tech/rss</docs>$RN";
print " <managingEditor>$this->ManagingEditor</managingEditor>$RN";
print " <webMaster>$this->WebMaster</webMaster>$RN";
}


function PrintBody($Title,$Link,$Description,$Category,$PubDate) // печать анонса
{
$RN="rn";
//$Title =$this->Translate($Title);
//$Link =$this->Translate($Link);
$Description =$this->Translate($Description);
print " <item>$RN";
print " <title><![CDATA[$Title]]></title>$RN";
print " <link>$Link</link>$RN";
print " <description><![CDATA[$Description]]></description>$RN";
print " <category><![CDATA[$Category]]></category>$RN";
print " <pubDate>$PubDate</pubDate>$RN";
print " <guid>$Link</guid>$RN";
print " </item>$RN";
}


function PrintFooter() // печать нижней сноски
{
print " </channel>$RN";
print "</rss>$RN";
}
}

 

 

Данный класс позволяет создавать ленту с помощью нескольких строк в основном коде.

 

Для начала заполним основные поля

 

$Rss= new Crss();//создадим класс

 

//заполним поля

$Rss->Title="My super blog";

$Rss->Link="http://7ion.ru";

$Rss->Copyright="© Super blogger 2009";

$Rss->Description="OWNED blog";

$Rss->Category = "Блог самого лучшего человека";

$Rss->Language="ru";

 

$Rss->ManagingEditor="superman@superblog.ru (Alexander Semion)";

$Rss->WebMaster=" superman@superblog.ru (Alexander Semion)";

$Rss->LastBuildDate=date("r");

$Rss->PubDate=$Rss->LastBuildDate;

 

 

Затем выведем шапку RSS

 

$Rss->PrintHeader();

 

 

У меня каждый анонс берется из базы данных, это не всегда самое лучшее решение, т.к. нет кэширования, но оно достаточно для мало нагруженных систем.

 

 

$result = mysql_query("SELECT * FROM `posts` ORDER BY `createtime` DESC");

while($line=mysql_fetch_array($result))

{

$Rss->PrintBody($line['title'],"http://superblog.ru/i?post={$line['postid']}&ampr=rss",$line['intro'],$Rss->Category,date("r",strtotime($line['createtime'])));

}

 

Заметьте что знак & обязательно должен быть кодирован как &amp.

 

И наконец завершим фид

 

$Rss->PrintFooter();

 

 

Как видите создать свою ленту очень просто.

 

  Удачного анонсирования.


© Alexander Semion