Desenvolvimento - PHP

Feed RSS em PHP com a classe SimpleXMLElement

Esse artigo ensina a criar um feed rss para seu site usando a linguagem PHP e a classe SimpleXMLElement.

por Thiago Belem



Bom.. Como viram sabemos existe uma classe pronta do PHP chamada SimpleXMLElement e é ela que vamos usar para gerar o nosso Feed RSS no artigo de hoje.

Na descrição de RSS na Wikipédia temos:

O termo Feed vem do verbo em inglês “alimentar”. Na Internet, este sistema também é conhecido como “RSS Feeds” (RDF Site Summary ou Really Simple Syndication).
Na prática, Feeds são usados para que um usuário possa acompanhar os novos artigos e demais conteúdo de um site ou blog sem que precise visitar o site em si. Sempre que um novo conteúdo for publicado em determinado site, o “assinante do feed” será notificado da atualização e poderá ler parte dela imediatamente, direto no seu agregador de RSS.

Eu vou ensinar a fazer um Feed RSS com um item, e depois mostrarei um exemplo de como seria se estivéssemos pegando as notícias de um banco de dados. Atenção: o formato do RSS aqui criado segue os padrões e especificações do RSS 2.0.

Vamos ao que interessa… A classe SimpleXMLElement já foi compilada junto com as versões atuais do PHP, então você não precisa instalar nada.. É só chamar a classe e sair brincando.

Primeiro chamamos a classe:

<?php

// Intanciamos/chamamos a classe
$rss = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><rss></rss>');

?>

Com isso iremos começar a criar uma estrutura XML com o formato que está sendo passado para a classe.

Agora iremos dizer que será um RSS versão 2.0, e para isso precisamos definir um atributo version do item <rss>, dessa forma:

<?php

// Intanciamos/chamamos a classe
$rss = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><rss></rss>');

$rss->addAttribute('version', '2.0');

?>

Até agora o nosso RSS tem um formato parecido com esse:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">

</rss>

O próximo passo é definir o elemento <channel> (canal) que contem todos os dados do RSS e cada um dos itens/notícias… Dentro dele iremos colocar mais três elementos, que são o<title> (titulo do RSS), o <link> (do site ao qual o RSS pertence) e a <description> (descrição do conteúdo RSS):

<?php
// Intanciamos/chamamos a classe
$rss = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><rss></rss>');
$rss->addAttribute('version', '2.0');

// Cria o elemento <channel> dentro de <rss>
$canal = $rss->addChild('channel');
// Adiciona sub-elementos ao elemento <channel>
$canal->addChild('title', 'Meu primeiro RSS');
$canal->addChild('link', 'http://www.meusite.com/');
$canal->addChild('description', 'Este é o meu primeiro RSS, uha!');

?>

E com isso, o nosso RSS ficará com um formato assim:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Meu primeiro RSS</title>
<link>http://www.meusite.com/</link>
<description>Este é o meu primeiro RSS, cheio de coisas legais!</description>

</channel>
</rss>

Estão percebendo a mágica do SimpleXMLElement? Ele vai criando um formato de XML perfeito pra você usar com quase qualquer coisa!

Bom… Já temos o formato básico do RSS.. Agora é só adicionar dois itens de exemplo e o nosso RSS estará quase pronto:

<?php
// Instanciamos/chamamos a classe
$rss = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><rss></rss>');
$rss->addAttribute('version', '2.0');

// Cria o elemento <channel> dentro de <rss>
$canal = $rss->addChild('channel');
// Adiciona sub-elementos ao elemento <channel>
$canal->addChild('title', 'Meu primeiro RSS');
$canal->addChild('link', 'http://www.meusite.com/');
$canal->addChild('description', 'Este é o meu primeiro RSS, uha!');

// Cria um elemento <item> dentro de <channel>
$item = $canal->addChild('item');
// Adiciona sub-elementos ao elemento <item>
$item->addChild('title', 'Meu segundo artigo');
$item->addChild('link', 'http://www.meusite.com/artigos.php?id=2');
$item->addChild('description', 'Esse é um resumo do meu segundo artigo.');

// Cria outro elemento <item> dentro de <channel>
$item = $canal->addChild('item');
// Adiciona sub-elementos ao elemento <item>
$item->addChild('title', 'Meu primeiro artigo');
$item->addChild('link', 'http://www.meusite.com/artigos.php?id=1');
$item->addChild('description', 'Esse é um resumo do meu primeiro artigo.');
$item->addChild('pubDate', date('r'));

?>

Cada <item> representa uma entrada do RSS, seria cada uma das notícias de um site de notícias, ou cada um dos artigos de um blog ou cada um dos apartamentos do site de uma imobiliária. A ordem dos <item>s deve ser é do mais recente para o mais antigo.

Os três sub-elementos obrigatórios dos <item>s são: o <title>, o <link>e o <description>… Existem vários outros sub-elemtos, um exemplo comum é o <pubDate> (coloquei ele no 2º item) que representa a data de publicação do <item> em questão, e segue o formato RFC 733, por exemplo: Thu, 21 Dec 2000 16:01:07 +0200. Esse formato pode ser obtido pelo parâmetro r passado para a função date() do PHP.

Depois de inserir os dois itens o formato do nosso RSS está concluído, ficando assim:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Meu primeiro RSS</title>
<link>http://www.meusite.com/</link>
<description>Este é o meu primeiro RSS, cheio de coisas legais!</description>

<item>
<title>Meu segundo artigo</title>
<link>http://www.meusite.com/artigos.php?id=2</link>
<description>Esse é um resumo do meu segundo artigo.</description>
</item>

<item>
<title>Meu primeiro artigo</title>
<link>http://www.meusite.com/artigos.php?id=1</link>
<description>Esse é um resumo do meu primeiro artigo.</description>
<pubDate>Thu, 21 Dec 2000 16:01:07 +0200</pubDate>
</item>

</channel>
</rss>

Agora, para concluir, precisamos apenas passar todo o conteúdo do RSS para o navegador (depois de definir qual será o tipo de conteúdo que ele irá receber), colocando isso depois de definir o último <item>:

// Define o tipo de conteúdo e o charset
header("content-type: application/rss+xml; charset=utf-8");

// Entrega o conteúdo do RSS completo:
echo $rss->asXML();
exit;

Pode ser que você encontre problemas de charset (UTF-8 x ISO-8859-1)… Procure sobre as funções utf8_encode() e utf8_decode() do PHP que elas irão te ajudar.

Se você quiser também pode criar um RSS baseado em uma consulta MySQL, inserindo vários <items> de uma vez… Veja um exemplo:

 // Instanciamos/chamamos a classe
$rss = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><rss></rss>');
$rss->addAttribute('version', '2.0');

// Cria o elemento <channel> dentro de <rss>
$canal = $rss->addChild('channel');
// Adiciona sub-elementos ao elemento <channel>
$canal->addChild('title', 'Meu primeiro RSS');
$canal->addChild('link', 'http://www.meusite.com/');
$canal->addChild('description', 'Este é o meu primeiro RSS, uha!');

// Define a consulta MySQL
$sql = "SELECT * FROM `noticias` WHERE (`ativa` = 1) ORDER BY `cadastro` DESC";
$query = mysql_query($sql) OR die(mysql_error());

// Inclui um <item> para cada resultado encontrado
while ($dados = mysql_fetch_assoc($query)) {
$id = $dados['id'];
$titulo = $dados['titulo'];
$texto = $dados['texto'];

// Cria um elemento <item> dentro de <channel>
$item = $canal->addChild('item');
// Adiciona sub-elementos ao elemento <item>
$item->addChild('title', $titulo);
$item->addChild('link', 'http://www.meusite.com/artigos.php?id='.$id);
$item->addChild('description', $texto);
}

// Define o tipo de conteúdo e o charset
header("content-type: application/rss+xml; charset=utf-8");

// Entrega o conteúdo do RSS completo:
echo $rss->asXML();
exit;

Espero que tenham gostado e que façam os seus XML’s e RSS’s com essa classe de agora em diante fica mais rápido!

Abraços e até a próxima.

Artigo originalmente publicado por: Thiago Belem em seu blog.
Thiago Belem

Thiago Belem - Tenho 23 anos e trabalho com Desenvolvimento WEB há mais de 10 anos. Atualmente moro no Rio de Janeiro e, além de trabalhar como Freelancer, sou Professor no Assando Sites, meu curso online de CakePHP.