This Might Be Useful

Как сделать свою RSS-ленту

Полагаю, что практически все слышали о том, что бывают ленты новостей. Но далеко не все сайтовладельцы пользуются этой несомненно полезной вещью. А ведь если Вы - владелец форума или новостного сайта, RSS - штука весьма нужная, она позволит Вашим посетителям просматривать заголовки новостей и заходить на сайт только для прочтения того, что им действительно нужно и интересно. Одним словом, я решил по возможности коротко рассказать о том, как создать свою RSS-ленту, взяв как пример скрипт, сделанный мною для своего форума.

Для начала выдаем правильный content-type:

PHP:
  1. header("Content-Type: application/rss+xml");

Затем формируем заголовок ленты:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  3.   <channel>
  4.     <title>Recovered.info</title>
  5.     <link>http://recovered.info/</link>
  6.     <description>Recovered.info Forum</description>
  7.     <language>ru-ru</language>

Следует обратить внимание на кодировку документа (encoding), а также заголовок, описание, ссылку и язык. Хотя, как показывает опыт, большинство RSS-reader'ов показывает только название ленты, скрывая остальную информацию.

Далее мы собственно должны вывести ленту новостей. Каждая запись состоит из заголовка (title), ссылки (link), описания (description) и даты (dc:date). Обязательными параметрами являются заголовок и ссылка, остальное можно при желании опустить. Или, наоборот, добавить имя автора, категорию или еще что-нибудь (см. описание стандарта).

PHP:
  1. <item>
  2.   <title>'.htmlspecialchars($topic_title).'</title>
  3.   <link>http://recovered.info/viewtopic.php?p='.$post_id.'#'.$post_id.'</link>
  4.   <description>
  5.     Topic:
  6.       &lt;a href="http://recovered.info/viewtopic.php?t='.$topic_id.'"&gt;'.
  7.         htmlspecialchars($topic_title).
  8.       '&lt;/a&gt;
  9.     &lt;br /&gt;
  10.     Forum:
  11.       &lt;a href="http://recovered.info/viewforum.php?f='.$forum_id.'"&gt;'.
  12.         htmlspecialchars($forum_name).
  13.       '&lt;/a&gt;
  14.   </description>
  15.   <category>'.
  16.     htmlspecialchars($forum_name).
  17.   '</category>
  18.   <dc:date>'.
  19.     strftime('%Y-%m-%dT%H:%M:%S+02:00', $last_post_time).
  20.   '</dc:date>
  21. </item>

Обратите внимание на то, что внутри тагов не должна встречаться спец-символы (<, > и т.д.). А также на формат времени (YYYY-mm-ddTHH:MM:SS+offset). Весьма распространенный недочет RSS-лент - это именно неверное указание времени публикации, что приводит к большой путанице в ленте и неудобствам при чтении. Кстати говоря, дату можно указывать и используя таг - в этом случае она должна соответствовать RFC 822.

После вывода всех записей остается только закрыть ленту:

XML:
  1. </channel>
  2. </rss>

А теперь посмотрим, как выглядит готовый скрипт для вывода ленты сообщений форума, использующего движок phpBB:

PHP:
  1. <?php
  2.  
  3. include('config.php');
  4.  
  5. header("Content-Type: application/rss+xml");
  6.  
  7. echo '<?xml version="1.0" encoding="utf-8"?>
  8. <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  9.   <channel>
  10.     <title>Recovered.info</title>
  11.     <link>http://recovered.info/</link>
  12.     <description>Recovered.info Forum</description>
  13.     <language>ru-ru</language>';
  14.  
  15. if (!($mysql = mysql_connect($dbhost, $dbuser, $dbpasswd)))
  16.   return 0;
  17.  
  18. if (!($db = mysql_select_db($dbname)))
  19.   return 0;
  20.  
  21. $result = mysql_query('SELECT phpbb_posts.topic_id, MAX(phpbb_posts.post_id),
  22.                               phpbb_topics.topic_title, phpbb_forums.forum_name,
  23.                               MAX(phpbb_posts.post_time) as last_post_time,
  24.                               phpbb_forums.forum_id
  25.                        FROM phpbb_topics, phpbb_posts, phpbb_forums
  26.                        WHERE ( phpbb_topics.topic_id = phpbb_posts.topic_id ) and
  27.                              ( phpbb_topics.forum_id = phpbb_forums.forum_id )
  28.                        GROUP BY phpbb_posts.topic_id
  29.                        ORDER BY last_post_time DESC
  30.                        LIMIT 15');
  31.  
  32. while (list($topic_id, $post_id, $topic_title,
  33.             $forum_name, $last_post_time, $forum_id) = mysql_fetch_row($result)) {
  34.   echo '
  35.       <item>
  36.         <title>'.htmlspecialchars($topic_title).'</title>
  37.         <link>http://recovered.info/viewtopic.php?p='.$post_id.'#'.$post_id.'</link>
  38.         <description>
  39.           Topic:
  40.             &lt;a href="http://recovered.info/viewtopic.php?t='.$topic_id.'"&gt;'.
  41.               htmlspecialchars($topic_title).
  42.             '&lt;/a&gt;
  43.           &lt;br /&gt;
  44.           Forum:
  45.             &lt;a href="http://recovered.info/viewforum.php?f='.$forum_id.'"&gt;'.
  46.               htmlspecialchars($forum_name).
  47.             '&lt;/a&gt;
  48.         </description>
  49.         <category>'.
  50.           htmlspecialchars($forum_name).
  51.         '</category>
  52.         <dc:date>'.
  53.           strftime('%Y-%m-%dT%H:%M:%S+02:00', $last_post_time).
  54.         '</dc:date>
  55.       </item>';
  56.  
  57. } // while - fetch rows
  58.  
  59.  
  60.   </channel>
  61. </rss>';
  62.  
  63. mysql_close($mysql);
  64.  
  65. ?>

Дополнительные материалы:

· Создание прямой ссылки на Network Connections
· Создание скриншотов в Windows Vista с сохранением всех визуальных эффектов
· MySQL функция для конвертирования bigint IP адресов в удобоваримые varchar
· Динамическое создание обработчиков событий
· Создаем свою captcha

- Коментировать
- Trackback

3 Responses to “Как сделать свою RSS-ленту”


  1. art Says:

    написал rss feeder,
    но при чтении например thunderbird'om при каждом рефреше все items скачиваются заново,
    как пофиксить??

  2. Filosoff Says:

    art @ 04.10.2007, 17:56 #

    написал rss feeder,
    но при чтении например thunderbird'om при каждом рефреше все items скачиваются заново,
    как пофиксить??

    либо это причуда Thunderbird'а, либо содержимое ленты постоянно меняется. проверьте, чтобы старые элементы всегда генерировались одинаковыми.

  3. art Says:

    и вправду оказалось странностью thunderbird'а
    другие ридеры так не делают ..

Leave a Reply

code