Criando e distribuindo Feed RSS com PHP

Criando e distribuindo Feed RSS com PHP

Vamos construir uma aplicação que entrega Feed das últimas notícias no formato RSS.

Publicado em

O Feed RSS é utilizado por diversos sites e portais de noticias, é através dele que fornecemos aos nossos usuários as últimas atualizações. Para ler esse Feed, é necessário um leitor especifico, já que o site ou página entrega o conteúdo no formato .XML.

RSS é um formato de distribuição de informações em tempo real pela internet, no qual um subconjunto de "dialetos" XML que servem para agregar conteúdo ou "Web syndication", podem ser acessados mediante programas ou sites agregadores. É usado principalmente em sites de notícias e blogs. Fonte Wikipedia

Atualmente o Feed RSS está na sua segunda versão, nomeada de Really Simple Syndication, que significa algo como Entrega muito simples.

Para você ver como isso funciona de perto, pode acessar o Feed RSS da SatellaSoft, disponível em: https://satellasoft.com/feed.

Utilizando o navegador Opera, por exemplo, podemos ver o Feed em ação, visto que por padrão o browser já tem um leitor de RSS.

Imagem sem descrição.
Imagem sem descrição.

Feed RSS com PHP

Agora que já vimos e entendemos para que serve o Feed RSS, vamos para a nossa videoaula, você pode conferir todas as aulas a seguir.

Introdução (Origem, conceito, funcionalidade...)

 

Preparando o ambiente (composer, montar estrutura de imagens...)

 

Criando os elementos principais do feed (rss, channel, image...)

 

Criando e testando os elementos finais

 

Código de Feed RSS com PHP

Todo o código utilizado na aula está disponível a seguir.

Estrutura de pastas:

app/
------ FeedRss.php
composer.json
index.php

FeedRss.php

<?php

namespace app;

use DOMDocument;

class FeedRss
{

    public function renderRss()
    {
        header('Content-type: text-xml');

        $data = $this->getData();

        if (empty($data)) {
            return;
        }

        $xml = new DOMDocument('1.0', 'utf-8');

        //Rss
        $rss = $xml->createElement('rss');
        $rss->setAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1');
        $rss->setAttribute('version', '2.0');

        //Channel
        $channel = $xml->createElement('channel');

        $channelTitle = $xml->createElement('title', 'Meu Site - O maior site Gamer da internet');
        $channelLink  = $xml->createElement('link', 'https://meusite.com');
        $channelDescription = $xml->createElement('description', 'O maior e melhor site gamer da internet');
        $channelLanguage    = $xml->createElement('language', 'pt-BR');

        $channel->appendChild($channelTitle);
        $channel->appendChild($channelLink);
        $channel->appendChild($channelDescription);
        $channel->appendChild($channelLanguage);

        $rss->appendChild($channel);

        //Image
        $image = $xml->createElement('image');

        $image->appendChild($xml->createElement('title', 'Meu Site - O maior site Gamer da internet'));
        $image->appendChild($xml->createElement('link', 'https://meusite.com'));
        $image->appendChild($xml->createElement('url', 'https://satellasoft.com/img/artigos/2021/01/343/estilizando-botoes-com-css-thumb.webp'));

        $channel->appendChild($image);

        //Itens

        foreach ($data as $produto) {

            $item = $xml->createElement("item");


            $itemDescription = $xml->createElement('description');
            $itemDescription->appendChild($xml->createCDATASection($produto['descricao']));

            $dtPub = date('D, d M Y H:i:s ', strtotime($produto['publicacao'])) . '-0300';
            $item->appendChild($xml->createElement('pubDate', $dtPub));

            $itemEnclosure = $xml->createElement('enclosure');
            $itemEnclosure->setAttribute('url',   $produto['imagem']['url']);
            $itemEnclosure->setAttribute('type', 'image/jpg');
            $itemEnclosure->setAttribute('length', 0);

            $item->appendChild($itemEnclosure);

            $item->appendChild($xml->createElement('link', $produto['link']));
            $item->appendChild($xml->createElement('guid', $produto['link']));

            //ITEM IMAGE

            $itemImage  = $xml->createElement('image');

            $imageTitle = $xml->createElement('title');
            $imageTitle->appendChild($xml->createCDATASection($produto['imagem']['titulo']));


            $itemImage->appendChild($xml->createElement('link', $produto['link']));
            $itemImage->appendChild($xml->createElement('url', $produto['imagem']['url']));
            $itemImage->appendChild($imageTitle);

            $item->appendChild($itemImage);

            //Fim

            $item->appendChild($itemDescription);


            $channel->appendChild($item);
        }


        $xml->appendChild($rss);

        $xml->formatOutput = true;
        echo $xml->saveXML();
    }

    private function getData()
    {
        return [
            [
                'descricao'  => 'Mouse Gamer de última geração',
                'publicacao' => '2020-12-31 23:10:59',
                'link'       => 'https://meusite.com/prouto/mouse-top',
                'imagem'     => [
                    'url'    => 'https://academy.satellasoft.com/img/thumbs/thumb_33f87bec68db791632b21808966dd778.webp',
                    'titulo' => 'mouse gamer de última geração com alta qualidade'
                ],
            ],

            [
                'descricao'  => 'teclado gamer de última geração',
                'publicacao' => '2020-12-27 13:10:00',
                'link'       => 'https://meusite.com/prouto/teclado-top',
                'imagem'     => [
                    'url' => 'https://satellasoft.com/img/artigos/2020/12/336/configurando_steam_link_no_android_thumb.webp',
                    'titulo' => 'Teclado gamer mecânico de última geração'
                ],
            ],

            [
                'descricao'  => 'Monitor gamer ultra-wide',
                'publicacao' => '2021-01-01 15:10:59',
                'link'       => 'https://meusite.com/prouto/monitor-ultra-wide',
                'imagem'     => [
                    'url' => 'https://satellasoft.com/img/artigos/2020/12/339/torchlight-ii-esta-de-graca-na-epic-store-thumb.webp',
                    'titulo' => 'Monitor games ultra-wide de última geração'
                ],
            ],

            [
                'descricao'  => 'Headset 7.1 com alta definição',
                'publicacao' => '2021-01-10 12:35:20',
                'link'       => 'https://meusite.com/prouto/headset-71',
                'imagem'     => [
                    'url' => 'https://satellasoft.com/img/artigos/2021/01/343/estilizando-botoes-com-css-thumb.webp',
                    'titulo' => 'Headset para jogos e filmes'
                ],
            ],

            [
                'descricao'  => 'Gabinete Gamer colorido com neon',
                'publicacao' => '2021-01-13 10:10:59',
                'link'       => 'https://meusite.com/prouto/gabinete-gamer',
                'imagem'     => [
                    'url' => 'https://academy.satellasoft.com/img/thumbs/thumb_f98feabf9c927b418ddf7803c823a929.jpg',
                    'titulo' => 'Gabinete Game colorido com muitos neons'
                ],
            ],

        ];
    }

    private static function dd($param)
    {
        echo '<pre>';
        print_r($param);
        echo '</pre>';
        die();
    }
}

index.php

<?php

require_once('vendor/autoload.php');

use app\FeedRss;

//$feed = new FeedRss();
//$feed->renderRss();

(new FeedRss())->renderRss();

composer.json

{
    "name": "gunna/projeto",
    "authors": [
        {
            "name": "SatellaSoft",
            "email": "email_...@gmail.com"
        }
    ],
    "require": {},
    "autoload" : {
        "psr-4": {
            "app\\" : "app/"
        }
    }
}

Não esqueça de abrir seu terminal e rodar o comando abaixo, assim o Composer vai criar o autoload corretamente.

composer update

Concluímos por aqui, espero que você tenha gostado e nos vemos na próxima.

Gunnar Correa
Gunnar Correa

Autodidata, Graduado em Desenvolvimento Web, Especialista em Tecnologias na Educação e Pós-graduando em Segurança da Informação. Começou seus estudos na área de programação quando era criança, e atualmente, está estudando desenvolvimento de jogos. Fundador da SatellaSoft, criado em 2009 com o intuito de compartilhar conhecimento de forma gratuita e inédita.

Todos os nossos cursos em promoção
Todos os nossos cursos em promoção

Webstories

Todos os nossos cursos em promoção

Todos os nossos cursos em promoção

Deixe um comentário
Aguarde...
Todos os nossos cursos em promoção