Войти Регистрация

RSS на PHP: Создание RSS ленты на PHP


Сейчас мы научимся создавать rss-канал на PHP. Создание RSS ленты на PHP доступно несколькими способами. Но прежде немного слов о самом rss формате.Что такое RSS?

RSS (Really Simple Syndication) – это тип данных языка XML, с помощью которого сайт может обмениваться информацией с несколькими сайтами (новости) в автоматическом режиме или для презентации новостей пользователю. Каждая RSS лента (RSS файл) должна соответствовать стандарту XML 1.0.

Преимущества RSS ленты

 

1) Экономия трафика для пользователей сайта.

2) Информирование пользователей о новых добавлениях.

3) Продвижение сайта с помощью rss каталогов.

4) Приток посетителей с rss-ленты.

 

Структура RSS ленты

 

Перед написанием RSS ленты на PHP, необходимо ознакомиться с ее структурой. Ниже предоставлена структура RSS ленты у версии формата RSS 2.0.

<?xml version="1.0"?>
   <rss version="2.0">
        <channel>
           <title>Название RSS ленты</title>
           <link>Ссылка на сайт ленты (ваш сайт)</link>
           <description>Краткое описание ленты (3-4 предложения)</description>
           <item>
               <title>Название новости</title>
               <link>Ссылка на новость в интернете</link>
              <description>Сокращенный текст (описание) статьи, новости</description>
              <author>Имя автора</author>
              <pubDate>Дата публикации новости</pubDate>
          </item>
          
            ...
            
          <item>
              <title>Название статьи </title>
              <link>Ссылка на статью, новость в интернете</link>
              <description>Описание</description>
              <author>Имя автора</author>
              <pubDate>Дата публикации</pubDate>
          </item>
       </channel>
  </rss>

Вот примерная структура RSS ленты. Заметьте, что элементы item это ваши посты, новости, статьи, материалы или что там еще у вас может на сайте быть. Данных элементов в ленте может быть 10-20, по вашему желанию. Также необходимо помнить что pubDate (формат даты) должен быть в виде: Sat, 07 Sep 2011 17:45:01 GMT, подробнее о данном формате узнаете далее.

 

Элементы RSS ленты

 

 

Обязательные элементы канала
title Имя RSS канала. Оно, например, может совпадать с названием сайта.
description Краткое описание RSS канала.
link Ссылка на сайт, с которым связан канал.
Необязательные элементы канала (channel)
language Язык канала (en-us - Английский; ru - Русский).
copyright Копирайт или сведения об авторстве на RSS ленту.
managingEditor Email адрес ответственного за контент канала.
webMaster Email адрес ответственного за техническую часть публикации канала.
pubDate Дата публикации канала, в соответствии с Date and Time Specification of RFC 822.
lastBuildDate Время последней модификации канала в соответствии с Date and Time Specification of RFC 822.
category Одна или несколько категорий, к которым принадлежит канал.
generator Название программы, использованной для генерирования RSS канала.
docs Ссылка на файл документации подвида RSS, который был использован для создания канала.
ttl Ttl расшифровывается как ‘time to live’. Это число минут, в течение которых канал сохраняет свою актуальность.
image Используется для подключения графического файла (GIF, JPEG, или PNG), который будет показан вместе с RSS каналом. Имеет следующие параметры:
title - обычно тот же текст, что и в RSS title;
description - описание графического файла, которое будет показано, если файл не доступен;
link - ссылка на страницу, с которой связан канал;
url - URL на файл формата JPEG, GIF или PNG, который связан с RSS каналом;
width - ширина рисунка.
height - высота рисунка.
skipHours Число часов, в течение которых RSS ридеры могут не проверять канал на обновления.
skipDays Число дней, в течение которых RSS ридеры могут не проверять канал на обновления.
Обязательные элементы итема (item)
title Имя итема (новости, сообщения) RSS канала.
description Краткое описание итема.
link ссылка на страницу, содержащую полное описание события.
Необязательные элементы итема (item)
author Email адрес автора сообщения.
category Категория итема.
comments Ссылка на страницу с комментариями по итему.
enclosure Описывает медиа-объект, присоединенный к итему. Имеет следующие параметры:
url - ссылка на файл объекта;
length - размер файла в байтах;
type - тип файла, в соответствии со спецификацией MIME.
guid Уникальная строка, используемая для идентификации итема.
pubDate Дата публикации итема, в соответствии с Date and Time Specification of RFC 822.

 

Способы создания RSS ленты на PHP

 

1.Написание RSS ленты вручную, средствами PHP.

Ниже предоставлен прямолинейный PHP код вывода RSS ленты, так будет проще для понимания. При вашем желании можно данный код усовершенствовать и поместить у функции, классы…

<?php
echo '<?xml version="1.0"?>
          <rss version="2.0">
          <channel>
          <title>Название RSS-канала</title>
          <link>ссылка на сайт канала</link>
          <description>Описание канала (кратко)</description>';
    $result=MYSQL_QUERY("SELECT id, title, text, date, author FROM article ORDER BY date DESC LIMIT 10");

    while ($row=MYSQL_FETCH_ARRAY($result))
   {
     $id=$row['id'];
     $title=$row['title'];
     $text=$row['text'];
     $date=$row['date'];
     $author=$row['author'];
     echo '<item>
            <title>$title</title>
            <link>ссылка на статью</link>
            <description>$text</description>
            <author>$author</author>
            <pubDate>$date</pubDate>
            <guid>ссылка на статью</guid>
         </item>';
   }     
   echo '</channel>
   </rss>';      
   ?>

Как правило, дата хранится в другом формате, у меня например в таком виде: 2011-12-29 12:47:00.

Для перевода в формат RFC 822 можно пользоваться следующей строкой:

$date=date("D, j M Y G:i:s", strtotime("2006-10-29 12:47:00")). " GMT";

Как видите реализовать RSS на PHP не так уж и сложно. Теперь давайте проверим результат работы, для этого в Опере я ввожу путь к файлу (http://sitear.ru/rss.php). Также можно представить браузеру RSS ленту, для этого в блок head вставляем следующую строку:

<link rel="alternate" type="application/rss+xml" title="RSS" href="http://sitear.ru/rss.php" />

Вот и все, мы написали полноценную RSS ленту на PHP.

2. Использование готовых PHP скриптов для создания RSS ленты.

Скрипт на PHP для вывода на сайте RSS 2.0 - новостей


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

Пример использования RSS-скрипта

<?php
include_once("write_rss.php");//подключаем файл с функцией вывода RSS-новостей
//адресс новостей (URL-адрес RSS потока)
$url_rss="http://sitear.ru/rss.php";
 //количество выводимых новостей
$kol_print_news=10;
 //имя файла для хранения RSS-новостей на локальном сервере (то есть кэш-файл)
$file_rss="cache_rss.xml"; 
//время обновления, в часах
$hclock=1;
print_rss($url_rss,$file_rss,$hclock,$kol_print_news); //вызываем функцию вывода RSS-новостей
?>

А вот собственно сам файл write_rss.php:

<?php
function print_rss($url_rss,$file_rss,$hclock,$kol_print_news)
  {
    //$url_rss - URL-адрес RSS потока
    //$file_rss - адресс файла для хранения RSS-новостей
    //$hclock - время обновления, в часах
    //$kol_print_news - количество выводимых новостей
	
    if (!file_exists($file_rss) || ( filemtime($file_rss) + $hclock*60*60 < time() ) )//если файл не сохраняли, то сохраняем на локальном сервере или если существует, то проверяем устарел ли файл (не более Х часов назад он записан)
      {
       if (@!copy ($url_rss,$file_rss))
         return (false);
       
       $text_rss=file($file_rss);
       $text_rss=implode("",$text_rss);
       //преобразуем кодировку данных
       //если не нежно конвертировать кодировку, то комментируем ниже идущее условие или редактируем
       if (preg_match('/<?xml[^>]+encoding[\s]*=[\s]*("|\')windows-1251("|\')[^>]+?>/i', $text_rss))
         {
          
          $text_rss = iconv("cp1251", "utf-8", $text_rss);
          file_put_contents($file_rss, $text_rss);//пишем данные обратно в файл
          
         }
      }
	  
    $text_rss=file($file_rss);
    $text_rss=implode("",$text_rss);
    
    $url_image = "";
    $image_is=preg_match("#<image>(.*?)</image>#is",$text_rss,$image_m);
    if ( $image_is )
      {
       
       $image_url_is = preg_match("#<url>(.*?)</url>#is",$image_m[0],$image_t);
       
       if ( $image_url_is )
         $url_image = $image_t[1];
      }
    
    $mas_item=array();
    preg_match_all("#<item>.*?</item>#is",$text_rss,$mas_item);
    
    $one_item=array();
    $t="";
    
    $t.=( $url_image ? "<div><img src='".$url_image."'  ></div>" :"");
    
    $kol=0;
    if (sizeof($mas_item)>0)
      {
       
       foreach ($mas_item[0] as $one_item)
         {
          
          $date = "";
          $kol++;
          $t_is=preg_match("#<title>(.*?)</title>#is",$one_item,$title);
          $l_is=preg_match("#<link>(.*?)</link>#is",$one_item,$link);
          $d_is=preg_match("#<description>(.*?)</description>#is",$one_item,$description);
          
          $date_is=preg_match("#<pubDate>(.*?)</pubDate>#is",$one_item,$date_t);
          
          if ($t_is && $l_is)
            {
             $title[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$title[1]);
             $link[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$link[1]);
             $description[1]=preg_replace("#<\!\[CDATA\[(.*?)\]\]>#eis","'\\1'",$description[1]);
             
             if ( $date_is )
               $date = strtotime($date_t[1]);
             
             
             $t.="<div><a href='".$link[1]."' target='_blank'>".$title[1]."</a> 
              <br>"
              .$description[1]
              .( $date ? "<br>".date("d.n.Y",$date) : "" )
              ."</div>";
             
            }
          if ($kol >= $kol_print_news) break;
         }
      }

    echo ($t);
    return (true);
  }
?>

Вот мы и разобрались с RSS лентой, теперь можете наслаждаться RSS на своем сайте. Если у вас есть варианты или пожелания по поводу RSS на PHP, можете высказаться в комментариях.



Дальше: Поисковые системы в общем


Дискуссия по теме    10 Комментариев
Добавить комментарий
Николай 25.07.2016 ? 18:12
Здравствуйте! Есть такой вопрос. Как в RSS можно исключать в заголовке слова, например (ФОТО) (ВИДЕО) и тд. Например на сайте заголовок выглядит так: В России спецназ взял штурмом взбунтовавшуюся колонию (ВИДЕО) В RSS он должен выглядеть так: В России спецназ взял штурмом взбунтовавшуюся колонию То есть автоматически исключить слово (ВИДЕО) из <title> Спасибо.
Дмитрий 11.02.2015 в 20:09
Вроде все ясно и понятно, но почему этот код : echo '<item> <title>$title</title> <link>ссылка на статью</link> <description>$text</description> <author>$author</author> <pubDate>$date</pubDate> <guid>ссылка на статью</guid> </item>'; выводит не значения тегов $title, $text и т.д, как текст(т.е вместо названия новости выводит слово "$title"),а не как значение из таблицы БД?
Serguy 20.07.2016 ? 15:09
Дмитрий, попробуйте так: echo '<item><title>'.$title. '<link>Ссылка на статью</link> <description>'.$text.'</description> <author>'.$author.'</author> <pubDate>'.$date.'</pubDate> <guid>Ссылка на статью</guid> </item>'; Сохраните проверьте в браузере. Но я не уверен в том, что всё получится. Запишите полный код документа со всеми тегами. Если не получится, я Вам пришлю исходники.
Андрей 06.10.2014 в 14:31
Я хочу на своем сайте выводить не собственную ленту, а с какого-то сайта новостеей, как мне это сделать
Олег 24.02.2014 в 17:05
Здравствуйте! У меня вопрос: как заставить ленту брать новости с картинкой? Мы создали свою ленту и она работает, но никак не удается прикрепить к новости в ленте изображение... Если есть возможность - помогите советом. Заранее спасибо
Тарас 24.02.2014 в 23:35
http://ru.wikipedia.org/wiki/RSS там в примере синтаксиса видно как это сделать.
Владимир 19.08.2013 в 22:55
Спасибо.
Богдан 13.08.2011 в 20:02
Владимир, вывод RSS ленты определяется самим браузером, а исходный код подобно сайтмапу соответствует стандарту и всего лишь транслирует последние новости.
Владимир 09.08.2011 в 10:36
Здравствуйте! У меня вопрос. Как сделать вывод новостей в две колонки ?
Петр 30.06.2012 в 09:37
Табличной версткой, либо через div'ы
Добавить комментарий
Просмотров: 28243