Publicidade (Anuncie Aqui)

Criando um Feed RSS com PHP

Criando um Feed RSS com PHP

Boa noite pessoal!

Essa semana várias pessoas me pediram para (re)fazer um artigo ensinando como gerar um Feed RSS via PHP.. E é isso que vamos fazer hoje.

Pra tentar uma abordagem diferente dos outros artigos, eu vou fazer dizer o que você precisa fazer, passo-a-passo, e só depois coloco o código completo, será que dá certo assim? Afinal.. Fiz esse blog pra ensinar, e não pra mostrar que sei. ;)

Bom.. Como viram no meu tópico ensinando sobre como ler um Feed RSS com PHP, existe uma classe pronta do PHP chamada SimpleXMLElement e iremos usá-la para gerar o nosso Feed RSS.

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!');

?>

Existem outros sub-elementos de channel, mas são todos opcionais… Veja a lista completa deles aqui.

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! :D

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

<?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!');

// 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 (lista), 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:

// 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!');

// 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;

Ahh, e pra quem for interessado e sistemático: validador de RSS do W3C.

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.

Você também vai gostar de ler:

Postado em MySQL, PHP, Tutoriais

Com as tags , , , , , , , , , , , , , , , , , , , , ,

Escrito por Thiago Belem

Gostou desse artigo?

Não se esqueça de assinar o RSS e divulgue-o para o mundo:

  • Olá
    Eu gostaria de saber como faço um leitor de feed de RSS com fotos, mas eu gostaria que aparece-se somente as fotos do RSS.
    Se for possivel me responde no meu e-mail eu agradeceria.
    Muito obrigado,

    Felipe Fulanetto
  • @Felipe
    Você deve inserir a imagem dentro do description com uma tag HTML mesmo... também recomendo colocar o link da imagem no link do item do RSS.
  • Mr.P
    Adorei o seu tutorial mas continuo com um problema antigo que voce acabou por nao explicar neste fantástico tutorial, que é como colocar uma imagem a aparecer no rss?

    Eu vejo alguns rss que mostram imagens, mas quando adiciono uma imagem no meu rss ela nunca aparece.
    Será que você pode dar uma dica?
    Obrigado
  • @Mr.P
    Você precisa inserir códigos HTML dentro da descrição do ITEM... Exemplo:
    [code language="xml" light="true"]<description><![CDATA[

    Artigo sobre a criação de Feeds RSS

    <img src="http://thiagobelem.net/img/logo.png" title="Thiago Belem" />]]></description>[/code]
    A parte do CDATA é necessária para inserir marcação HTML dentro de uma tag de RSS/XML.
  • Eduardo
    Parabéns pelo artigo. Não consegui funcionar com o exemplo da bd. Será que o meu erro é no tipo de dados dos campos? Eu coloquei o id como um número e o título e o texto como varchar. Será que é isso? Como devo colocar? A ligação está bem mas ele não me vai buscar os dados da bd. O que devo fazer?
  • @Eduardo
    Como você alterou a consulta SQL que busca as notícias?
  • e aí thiago tudo bem? parabéns pelo blog! ta show, otima didatica. quem sabe voce pode me ajudar. montei um rss pro meu site, porém tá ocorrendo o seguinte, ele trabalha com datas em timezone gmt usando a funcao gmdate... porém ele ta resgatando uma data correta do mysql, está exibindo no código fonte do feed com 3 horas a mais, e está exibindo no browser corretamente... agora fico na duvida, o que importa pros leitores de rss, o que está sendo exibido, ou o que está no codigo fonte?

    tentei usar o date, mas assim exibe corretamente no codigo fonte, porém exibe 3 horas a menos no browser...

    exemplo:

    data no mysql: 2009-06-30 20:29:03
    data no codigo fonte: Tue, 30 Jun 2009 23:29:03 GMT
    data no browser: terça-feira, 30 de junho de 2009 20:29

    funcao usada: gmdate("D, d M Y G:i:s", strtotime($last_modified))

    grato desde já!

    abraço!
  • @Bruno
    A data realmente não importa, mas preze pela que está no código fonte... ;)
  • Wox
    Thiago,

    Como faço para mostrar apenas as 3 últimas notícias de um RSS?
    Funcionou, mas queria mostrar apenas as 3 últimas, existe algum vetor em que eu coloque num FOR?
  • @Wox
    Antes do for coloca:
    $n = 1;
    E dentro dele, logo na primeira linha, coloca:
    if ($n++ > 3) break;
  • Joe
    Não estou a conseguir por a funcionar, funciona com php 4?
blog comments powered by Disqus