БлогNot. PHP: пишем ленту новостей RSS

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 [18256 просмотров]


теги: программирование блог php форматы xml rss

показать комментарии (2)