Nos últimos posts aprendemos o que é um Feed RSS, como surgiu, qual é sua cara e como ler suas informações. Agora chegou a hora de juntar tudo isso e descobrir como criar um RSS do seu site, publicando as suas notícias para que todos possam conferir.
O cenário de testes que vou propor se tratará de um site simples de notícias, por exemplo, um site corporativo que deseja divugar as novidades sobre sua empresa ou ramo. Vamos detalhar a base de dados e mostrar de forma geral como transformar os dados da tabela em um feed RSS atualizado.
1º Passo – Base de Dados
Ok, então voce tem uma base de dados com notícias, digamos que ela tem a estrutura abaixo:
CREATE TABLE `materias` ( `idmaterias` int(10) unsigned NOT NULL auto_increment, `datarg` datetime default NULL, `credito` varchar(100) default NULL, `chamada` varchar(150) default NULL, `conteudo` text, `imagem` varchar(60) default NULL, PRIMARY KEY (`idmaterias`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
A tabela contêm as informações básicas que precisamos, como data de publicação, chamada e conteúdo.
2º Passo – Resgatar informações
Ok, então vc tem um banco de dados com uma lista de matérias, digamos umas 5, e agora?
Como cada pessoa usa uma classe diferente para acessar o banco de dados, ou usa as funções nativas do PHP, não vou entrar em detalhes e mostrar como buscar dados no MySQL. Vamos pular para o resultado final, um array com as matérias neste formato:
Array ( [0] => Array ( [idmat] => 2525 [datarg] => 06/09/2006 00:25:42 [chamada] => Câmara aprova fim do voto secreto em plenário [conteudo] => A Câmara dos Deputados aprovou nesta terça-feira, em primeiro turno, por 383 votos... ) )
3º Passo – Montar a estrutura do RSS
Nos artigos anteriores já aprendemos como montar um XML usando DOM no PHP e conhecemos a estrutura de um arquivo RSS, agora só precisamos juntar estes conhecimentos.
A idéia aqui é simples, primeiro devemos montar a estrutura básica do RSS, e então devemos percorrer o array acima cadastrando cada uma das matérias. O código abaixo realiza esta ação, e seria executada logo após nossa busca no banco de dados.
< ? //Formata texto para inserção no XML para evitar erros //de invalidade, ou charset (Veja artigo "Ajax e acentos") function xmlSafeText($text){ $text = strip_tags($text); $text = utf8_encode($text); $text = str_replace('&','&',$text); $text = htmlspecialchars($text); return $text; } //Funçao EXEMPLO que retorna array de notícias como descrito no artigo $noticias = getNoticiasFromDB(); //Iniciar documento XML $xmlDoc = new DOMDocument('1.0','utf-8'); $xmlDoc->formatOutput = true; //elemento RSS $xmlRSS = $xmlDoc->createElement('rss'); $xmlRSS->setAttribute('version','2.0'); $xmlRSS = $xmlDoc->appendChild($xmlRSS); //Elemento CHANNEL $xmlChannel = $xmlDoc->createElement('channel'); $xmlChannel = $xmlRSS->appendChild($xmlChannel); //Setar dados do Canal $xmlCanalTitle = $xmlDoc->createElement('title',xmlSafeText('Meu Exemplo - Últimas Notícias')); $xmlCanalDescription = $xmlDoc->createElement('description',xmlSafeText('Últimas notícias do meu exemplo')); $xmlCanalLink = $xmlDoc->createElement('link','http://blog.rafaeldohms.com.br'); //Anexar nodes na arvore xml $xmlCanalTitle = $xmlChannel->appendChild($xmlCanalTitle); $xmlCanalDescription = $xmlChannel->appendChild($xmlCanalDescription); $xmlCanalLink = $xmlChannel->appendChild($xmlCanalLink); //Percorrer array de notícias adicionando cada uma no xml foreach ($noticias as $mat){ //Criar node ITEM $xmlItem = $xmlDoc->createElement('item'); $xmlItem = $xmlChannel->appendChild($xmlItem); //Adicionar código unico de identificação $xmlMatGuid = $xmlDoc->createElement('guid','http://blog.rafaeldohms.com.br/index.php?idpaginas=20&idmaterias='.$mat['idmat']); //Título da materia $xmlMatTitle = $xmlDoc->createElement('title',xmlSafeText($mat['chamada'])); //Conteudo - resumo, vamos colocar apenas 250 chars desta matéria ou podemos colocar completo, sua escolha, seu objetivo $xmlMatDescription = $xmlDoc->createElement('description',xmlSafeText(substr($mat['desc'],0,255).'...'); //Link para materia completa $xmlMatLink = $xmlDoc->createElement('link','http://blog.rafaeldohms.com.br/index.php?idpaginas=20&idmaterias='.$mat['idmat']); //Data de publicação (r = data no formato RFC 2822 - Padrão para o RSS) //Ex: Thu, 21 Dec 2000 16:01:07 +0200 $xmlMatPubDate = $xmlDoc->createElement('pubDate',date('r',strtotime($mat['datarg']))); //Anexar no XML $xmlMatGuid = $xmlItem->appendChild($xmlMatGuid); $xmlMatTitle = $xmlItem->appendChild($xmlMatTitle); $xmlMatDescription = $xmlItem->appendChild($xmlMatDescription); $xmlMatLink = $xmlItem->appendChild($xmlMatLink); $xmlMatPubDate = $xmlItem->appendChild($xmlMatPubDate); } //Definir CHARSET para xml (Veja artigo "Ajax e acentos") header("Content-type:application/xml; charset=utf-8"); //Echoar XML Final, jogar para browser echo $xmlDoc->saveXML(); ?>
4º Passo – Publicando seu RSS
Executando os passos anteriores temos agora um arquivo que ao ser executado busca matérias recentes no banco, gera uma string em formato RSS e retorna estes dados para serem lidos por um leitor de RSS. Agora precisamos avisar o usuário que nosso site tem um feed RSS que ele pode utilizar.
Duas formas de fazer isso são as mais utilizadas, a primeira é simples e visual, focada realmente no usuário. Se trata de adicionar em local estratégicos do site um pequeno botão laranja, com RSS ou XML escrito (BOTAO), linkando este botão para o endereço do feed.
A segunda forma é focada nos navegadores e ferramentas de RSS. Um código especial (link header) inserido no cabecalho da pagina indica que ela possui um equivalente em formato RSS no endereço específico, pense nisso como uma bandeira indicando uma cópia de tal página em outra lingua. Navegadores preparados ou leitores de RSS identificam esta tag e automaticamente interpretam o endereço indicado ou alertam o usuário sobre o feed, questionando se ele deseja adicionar a sua lista de feeds ou não. Veja abaixo o formato do tag que deve ser adicionado dentro do elemento <head>:
<link rel="alternate" type="application/rss+xml" href="http://www.comuniweb.com.br/rss.php" title="RSS: ComuniWEB - Últimas Notícias"></link>
Conclusão
Com isso chegamos ao final desta sequencia de artigos sobre RSS.
- Um estudo em RSS – Parte 1: XML DOM — O primeiro artigo descreveu o que é um RSS e como pode ser “lido” ou agregado. Também falei sobre como gerar arquivos XML no PHP usando o DOM.
- Um estudo em RSS Parte 2: O Formato RSS — No segundo artigo apresentei o histórico do formato RSS 2.0 e descrevi cada item de sua estrutura XML.
Finalmente neste arquivo juntamos todo conhecimento e geramos um feed a partir de um banco de dados com notícias. Espero que estes artigos tenham ajudado vocês, aos leigos um pouco sobre como usar e por que usar um RSS, e aos desenvolvedores como publicar seus conteúdos neste formato.
Por favor sintam-se a vontade para deixar perguntas e sugestões nos comentários, posso sempre voltar ao assunto com novos tutoriais e artigos se for necessário. Obrigado pela paciência de todos que seguiram até aqui 😀
Tudo bem Rafael ?
Primeiramente gostaria de parabelizá-lo pela matéria sobre RSS, muito bom. Estou entrando agora na programação RSS e gostaria de saber se não tem como fazer um leitor em PHP desses feeds online (link’s), por exemplo, imagine a seguinte situação, olha que legal : Tenho um banco de dados mysql com vários links de notícias RSS aonde eu faço um sorteio desses links e mostro a noticia em meu site.
O problema é o seguinte, o exemplo citado é com o arquivo xml local, mas eu quero ele através do link, que é o dado atualizado. Como faço isto, você tem alguma coisa aí ? Já achei vários exemplos só que tudo com arquivo local… nada através dos links…
Se puder me ajudar favor enviar um email.
Obrigado,
Abraços e sucesso.
Carlo,
Obrigado pelo elogio, que bom que pude ajudar.
Estou finalizando esta semana um script AJAx/PHP que atualiza em tempo real uma lista de noticias do RSS, talvez seja interessante para voce dar uma olhada.
Mas mesmo assim, a melhor forma que vi de ler arquivos RSS com PHP é usando a classe simpleXML que é nativa do PHP 5+. Com ela voce simplesmente usa o comando: simplexml_load_file(‘http://endereçodo/feed’);
e ela carrega todo o eskema belezinha, como um arquivo de XML local.
Até o fim da semana vou escrever um artigo sobre este script e entro em mais detalhes, qualquer coisa só da um toque por email.
abraço
Opa!
cara, parabéns pelo artigo. Realmente muito bom, tornou a coisa simples, ou melhor, mostrou que ela é simples…
Queria saber se existe alguma forma de implementar um feed em uma área restrita do site e fazer autenticação do usuário antes que ele possa acessá-lo, independentemente do leitor que ele esteja usando.
Alguma dica?
Rafael,
acho que tenho a mesma dúvida do Piter, isto é, como publicar um feed para uma área restrita… na verdade quero fazer o upload de um podcast, disponibilizar um arquivo mp3 com um feed…. mas não estou conseguindo fazer o upload, propriamente dito. Preciso fazer um link? Obrigada!
bem eu não sei mexer com mysql… tudo pode me ajudar mande para min .. walleeeww..
bem quantos arquivos são um php outro xml … sounovo nisso pode me ajudar..grato
Olá.
Muito interessante o seu tuto e bastante simples de se intender.
Gostaria da sua ajuda uma vez que para mim ocorreu um problema.
Na realidade é mais uma dúvida do que um problema.
Tenho em meu computador o Apache instalado com o PHP 5 e meu arquivo de rss funciona perfeitamente.
Porém no servidor a versão pe inferior de forma que ocorre erro ao se executar o script.
Gostaria de saber se existe alguma forma de solucionar esse problema, ou ainda, como poderia proceder para trocar o php do servidor (não sei se isso seria possível, porém…).
Obrigado desde já.
Estimado, muito bom, consegui fazer certinho o que você passou aqui. Muito obrigado mesmo. No firefox tem como aparecer os titulos das noticias, a ordem pode ser organizada com o tag opcional pubDate?.
Rafael,
Li seus artigos, e realmente me ajudaram a entender mais ou menos como isso funciona, mas veja meu caso. Não mexo com programação a anos (sou da época que SQL e ASP eram as revoluções….) Voltei a postar no meu blog, mas nem imagino como fazer disso um RSS, pois uso o blogger, e assim não tenho acesso a bancos de dados, nem nada disso, fui descobrir que isso era importante só no tecnorati… você tem alguma sugestão para que meus posts possam alimentar um feed? Ou vou ter que aprender xml e php para isso?
Valeu,
Carlos
Carlos,
O Blogger já possui esta ferramenta disponível para você, entre em seu blog como se fosse um visitante e procure o icone de “rss”, geralmente ele é ou um RSS laranja, ou um simbolo com “ondas”, e veja o caminho para qual ele aponta, este é seu feed rss.
Para adiantar sua vida, no seu caso procure este texto no final da página:
Assinar: Postagens (Atom)
Ele aponta para o seu feed, que é http://carloslavieri.blogspot.com/feeds/posts/default
Abraço!
Cara parabéns pelo script, pena que a maioria ainda usa notificações por email 🙁
rss é bem mais pratico!