PHP: пишем ленту новостей RSS
Технология 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 нужно именно так, как в образце - адрес, а в скобках - имя.
Нам остаётся сформировать ленту новостей по следующему алгоритму:
- С помощью SQL-запроса получить последние 10 (или 20, или сколько нужно) записей блога, отсортированных по убыванию даты; если ни одной записи нет, не будет и ленты, если записей окажется меньше 10, лента всё равно будет работать, выводя столько новостей, сколько есть.
- Организовать типовой цикл обработки результатов запроса. При обработке первой статьи подставить её дату в качестве $LastBuildDate и отдать браузеру заголовок XML-документа.
- При обработке остальных записей каждый раз формировать новый элемент Item и отдавать его браузеру.
Вот код ленты в самом общем виде, для Вашей ленты понадобится изменить запрос - ведь имя базы и таблицы может отличаться, и поставить свои поля таблицы в цикле формирования записей Item
.
//Коннект к базе уже выполнен, например, такой: $mysql=mysql_connect(DB_HOST, DB_USER, DB_PASS); //хост, логин, пароль mysql_select_db(DB_NAME); //имя базы данных mysql_query("SET CHARACTER SET 'cp1251'",$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-канала этого блога.
Валидатор RSS онлайн - там можно проверить свой канал. Мой оказался валидным :)
18.07.2011, 11:12 [18451 просмотр]