Создание RSS-ленты новостей

Формат RSS фактически является XML-форматом, а значит мы можем использовать возможности расширения DOM для создания RSS-ленты. Приведенный ниже код расширяет класс DOMDocument, чтобы построить дерево DOM, создавая элементы и добавляя их в соответствующую структуру.

<?php
class rss2 extends DOMDocument {
  private $channel;
 
  public function __construct($title, $link, $description) {
    parent::__construct();
    $this->formatOutputtrue;
   
    $root = $this->appendChild($this->createElement('rss'));
    $root->setAttribute('version', '2.0');
   
    $channel = $root->appendChild($this->createElement('channel'));
   
    $channel->appendChild($this->createElement('title', $title));
    $channel->appendChild($this->createElement('link', $link));
    $channel->appendChild($this->createElement('description', $description));
   
    $this->channel = $channel;
  }
 
  public function addItem($title, $link, $description) {
    $item = $this->createElement('item');
    $item->appendChild($this->createElement('title', $title));
    $item->appendChild($this->createElement('link', $link));
    $item->appendChild($this->createElement('description', $description));
    $this->channel->appendChild($item);
  }
}
?>

Конструктор класса создает и инициализирует элементы <rss> и <channel>. Он принимает три аргумента: название канала, ссылку и описание. Конструктор вызывает метод parent::__construct(), что фактически приводит к вызову метода DOMDocument::__construct(). После этого можно приступать к построению документа.

Сперва устанавливаем атрибут formatOutput в значение true. В вывод будут добавлены отступы и символы перевода строки, так что его будет легче читать.

Затем создаем корневой элемент документа, т.е rss, и устанавливаем атрибут version в значение 2.0, потому как мы строим ленту новостей формата RSS 2.0.

Все данные будут находиться внутри элемента channel под узлом rss, поэтому следующий шаг - создание этого элемента и инициализации его элементов-потомков title, link и description.

Все эти данные берутся из аргументов, переданных конструктору. Они создаются методом CreateElement(), который позволяет указать как имя элемента, так и текстовой узел за один вызов.

Наконец, сохраняем элемент channel, чтобы упростить обращение к нему в дальнейшем.

Для добавления новых статей предназначен метод addItem(). Поскольку элементы item содержат те же данные, что и channel, код метода addItem() почти идентичен коду конструктора.

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

<?php
$dblocation = 'localhost';   // Имя сервера
$dbuser     = 'root';        // Имя пользователя
$dbpswrd    = '';            // Пароль
$dbname     = 'mydb';        // Имя базы данных

// Соединение с сервером базы данных
$dblink = mysql_connect( $dblocation, $dbuser, $dbpswrd );
mysql_query( 'SET NAMES UTF8' );
// Выбираем базу данных
mysql_select_db( $dbname, $dblink );

$rss = new rss2('Новости по системам безопасности', 'http://sec-news.ru',
                'Российские новости по техническим средствам и системам безопасности
                (видеонаблюдение, контроль доступа, охранно-пожарная сигализация)'
);

$query = 'SELECT id, title, announce
          FROM news
          ORDER BY puttime DESC
          LIMIT 10'
;
$res = mysql_query( $query );
               
while( $news = mysql_fetch_array( $res ) ) {
  $rss->addItem($news['title'], 'http://sec-news.ru/news/'.$news['id'].'/', $news['announce']);
}

echo $rss->saveXML();
?>

Комментариев: 2

  1. Manage:

    Не помню точно какие версии rss бывают. Но данный код наверно подошёл бы полностью для собственных сайтов, чтоб rss-ленты генерить.

  2. compozitor:

    спасибо хорошая статья, поболь ше бы таких примеров.
    А у вас тут граватары на форуме подключены??? :)

Оставьте свой отзыв