|
Pers.narod.ru. PHP. Статьи. Пишем ленту RSS на PHP |
Технология RSS - это стандартный способ описания новостей, анонсов статей, изменений в блогах и тому подобного часто обновляющегося содержимого.
Всё, что нужно для программирования своей ленты новостей - сгенерировать XML-файл, соблюдающий правила разметки RSS, а всё остальное выполнит Ваш браузер или специализированный RSS-агрегатор.
Актуальность этого довольно старого формата связана с тем, что без RSS-ленты Ваш блог не возьмут в рейтинг блогов, вроде Яндексовского, не получится и связать блог с веб-агрегатором новостей, таким как Яндекс.Лента или Google Reader, соответственно, Вы никогда не узнаете, сколько у Вас подписчиков.
В большинстве случаев программирование RSS-ленты для типового "движка" на PHP+MySQL сведётся к одному запросу и одному программному циклу, то есть, сделать ленту очень легко. Покажем это на примере моего блога.
Как и большинство других структурированных файлов, XML-файл ленты состоит из заголовка, содержимого и завершающих тегов. Полное описание формата можете почитать сами вот здесь:
Описание формата RSS 2.0 (english)
А мы ограничимся небольшим количеством стандартных для всех версий RSS тегов, которые нужно прописать в заголовке.
| Элемент | Описание |
| title | Заголовок канала |
| link | Ссылка на главную страницу сайта. |
| description | Описание канала |
| language | Язык, на котором написан канал. Например, ru - русский |
| copyright | Копирайт |
| managingEditor | Электронная почта редактора канала. |
| webMaster | Электронная почта веб-мастера. |
| pubDate | Дата публикации информации в канале. |
| lastBuildDate | Время последнего изменения канала. |
| category | Определяет категорию, к которой принадлежит канал. |
| Item | Собственно содержимое канала. Должен быть хотя бы один такой элемент |
В свою очередь, каждый элемент Item требует указания нескольких
вложенных тегов:
| Элемент | Описание |
| title | Заголовок |
| link | Ссылка на полный текст статьи |
| description | Аннотация статьи |
| category | Категория статьи (я для простоты не стал формировать этот тег, лента работает во всех браузерах и без него) |
| pubDate | Дата публикации статьи. Желательно ставить реальную дату, а не текущую или ещё не наставшую, иначе некоторые агрегаторы просто не будут отображать такую новость |
Привёдем пример заполнения свойств заголовка:
$Title='Мой блог';
$Link='http://URL-главной-страницы/';
$Copyright='Мой копирайт';
$Description='Краткое описание ленты новостей';
$Category="news";
$Language="ru";
$ManagingEditor='admin@mail.com (Vasiliy Ivanov)';
$WebMaster='admin@mail.com (Vasiliy Ivanov)';
$LastBuildDate=@date("r");
Свойство $LastBuildDate мы потом перепишем, подставив реальную дату последнего обновления,
ставить всё время текущую нехорошо. Писать адреса E-mail для RSS нужно именно так, как в образце - адрес, а в скобках - имя.
Нам остаётся сформировать ленту новостей по следующему алгоритму:
Вот код ленты в самом общем виде, для Вашей ленты понадобится изменить запрос - ведь имя базы и таблицы может отличаться, и поставить свои поля таблицы в цикле формирования записей Item.
Разумеется, вместо констант DB_HOST и т.д. также нужно поставить свои настройки коннекта к базе данных.
//Коннект к базе уже выполнен, например, такой:
$mysql=mysql_connect(DB_HOST, DB_USER, DB_PASS); //хост, логин, пароль
mysql_select_db(DB_NAME); //имя базы данных
dbquery("SET CHARACTER SET win-1251",$mysql);
//Извлекаем последние 10 записей
$result=mysql_query('select * from БАЗА order by date desc limit 0,10');
//Если ошибка запроса или нет записей - выйти на главную страницу
if (!$result or mysql_num_rows($result)<1) header('Location: index.php');
$hdr=false; //Заголовок ещё не выведен
while ($note = mysql_fetch_assoc($result)) {
if ($hdr==false) { //Если ещё не печатали заголовок
$hdr=true; //Сделать это 1 раз
$LastBuildDate=@date("r",$note['date']);
//Правим $LastBuildDate, предполагается, что дата хранилась как число bigint,
//если это не так, используйте strtotime($note['date'])
$PubDate=$LastBuildDate; //Ставим $LastBuildDate как дату публикации
header("Content-Type: application/xml"); //Заголовок XML-документа
//И печатаем всё, что нужно в заголовке:
print "<?xml version=\"1.0\" encoding=\"windows-1251\" ?>\r\n".
"<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">\r\n".
"<channel>\r\n".
"<atom:link href=\"".$Link.'rss.php'."\" rel=\"self\" type=\"application/rss+xml\"/>\r\n".
"<title>$Title</title>\r\n".
"<category>$Category</category>\r\n".
"<link>$Link</link>\r\n".
"<copyright>$Copyright</copyright>\r\n".
"<description>$Description</description>\r\n".
"<lastBuildDate>$LastBuildDate</lastBuildDate>\r\n".
"<language>$Language</language>\r\n".
"<pubDate>$PubDate</pubDate>\r\n".
"<docs>http://blogs.law.harvard.edu/tech/rss/</docs>\r\n".
"<managingEditor>$ManagingEditor</managingEditor>\r\n".
"<webMaster>$WebMaster</webMaster>\r\n";
}
//Здесь получаем, как минимум, следующие поля из записи $note:
$title = strip_tags($note['name']); //Заголовок очередной новости
$description = $note['anons']; //Блок содержимого новости, можно не удалять теги
$s='http://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME'];
$sb=strrchr($s,"/");
if ($sb!==false) $s=substr($s,0,-(strlen($sb)-1)); //Кросс-платформенно извлекли URL папки скрипта
$link= $s.'index.php?id='.$note['id']; //И сформировали URL записи, содежащей полную новость
$pubdate=@date("r",$note['date']);
//Заполнили дату публикации, предполагается, что она хранилась как число bigint
//Выводим элемент:
print "<item>\r\n".
"<title>".htmlspecialchars($title)."</title>\r\n".
"<link>".htmlspecialchars($link)."</link>\r\n".
"<description>".htmlspecialchars($description)."</description>\r\n".
//"<category>$category</category>\r\n". //не добавляем категорию к каждой новости
"<pubDate>$pubdate</pubDate>\r\n".
"<guid>$link</guid>\r\n".
"</item>\r\n";
}
//Осталось закрыть файл
print "</channel>\r\n</rss>\r\n";
Теперь сохранем получившийся код как файл rss.php в папке блога, добавляем в титул документа блога (внутрь тега <HEAD>) строку
<link rel="alternate" href="http://www.ваш_сайт.ru/rss.php" type="application/rss+xml" title="MyRSS">
(вместо MyRSS также подставьте свой заголовок) и делаем кнопку RSS (стандартная нарисована здесь) со ссылкой на нашу ленту вида http://www.ваш_сайт.ru/rss.php
Что получилось, можно увидеть в верхней строке этого блога.
Валидатор RSS онлайн - там можно проверить свой канал. Мой оказался валидным :)
|
|