Criar sitemap automaticamente em PHP

Aprenda a gerar seu sitemap automaticamente com um script em PHP e enviar para o Google sem esforço nenhum

Por | PHP

Fala pessoal tudo beleza?

Hoje quero compartilhar um código bem bacana para gerar o sitemap do seu blog automaticamente sem que você precise se esforçar para isso. Parece bom né?!

Se você tem um blog que semanalmente você posta artigos novos e depois precisa manualmente ir no arquivo sitemap e atualizar na mão e até mesmo ir no Google e enviar seu sitemap seu problema irá acabar.

Esse código busca todos os seus posts no banco de dados e cria o sitemap atualizado e sem esforço nenhum envia para o Google! Bom vamos ver como funciona.

Conexão com o banco

Primeiro vamos conectar com o nosso banco.

// Dados de conexao com o banco
define('MYSQL_HOST', 'localhost');
define('MYSQL_USER', 'db_user');
define('MYSQL_PASSWORD', 'db_password');
define('MYSQL_DB_NAME', 'db_name');
define('HOME', 'http://example.com');

Vamos utilizar o try catch para realizar a conexão.

try
{
    // Realiza a conexao com o banco - PDO
    $PDO = new PDO('mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB_NAME, MYSQL_USER, MYSQL_PASSWORD);
    $PDO->exec("set names utf8");
}
catch (PDOException $e)
{
    echo 'Erro ao conectar com o banco: ' . $e->getMessage();
}

Conexão realizada. Vamos agora buscar os posts no banco de dados.

Realizando a busca

Agora vamos buscar no banco de dados todos os posts ativos e definir em uma variável a data e hora atual do sistema em formato ISO8601 (2017-11-22T00:06:23-02:00).

// Realiza a consulta no banco de todas as postagens ativas
$sql = "SELECT * FROM posts WHERE status = 'PUBLISHED'";
$result = $PDO->query($sql);
$rows = $result->fetchAll(PDO::FETCH_ASSOC);

// Data e hora atual
$datetime = new DateTime(date('Y-m-d H:i:s'));
// A linha abaixo me retornará uma data no seguinte formato: 2017-11-22T00:06:23-02:00
$date = $datetime->format(DateTime::ATOM); // ISO8601

Gerando o XML

Agora aqui que é a sacada. Iremos criar o XML e nos posts iremos colocar um foreach para que ele percorra todo nosso array e gere uma lista com os posts atualizados.

// Gera o arquivo XML do sitemap
    $xml = '<?xml version="1.0" encoding="UTF-8"?>
    <urlset
	xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
	http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
	<url>
	    <loc>'.HOME.'</loc>
	    <lastmod>'.$date.'</lastmod>
	    <changefreq>weekly</changefreq>
	    <priority>1.00</priority>
	</url>';
	foreach($rows as $v){
	    $datetime = new DateTime($v['updated_at']);
	    $date = $datetime->format(DateTime::ATOM);
	    $xml .='
                <url>
		    <loc>'.HOME.'/'.$v['slug'].'</loc>
	            <lastmod>'.$date.'</lastmod>
		    <changefreq>weekly</changefreq>
	            <priority>0.85</priority>
		</url>';
	}
	$xml .= '
    </urlset>';

Agora vamos criar o arquivo sitemap propriamente dito. Usando a função fopen do PHP iremos abrir o arquivo e caso ele não exista o PHP irá criar um. Depois escreveremos o conteúdo da variável $xml no arquivo que acabamos de criar.

// Abre o arquivo ou tenta cria-lo se ele não exixtir
$arquivo = fopen('sitemap.xml', 'w');
if (fwrite($arquivo, $xml)) {
    echo "Arquivo sitemap.xml criado com sucesso";
} else {
    echo "Não foi possível criar o arquivo. Verifique as permissões do diretório.";
}
fclose($arquivo);

Compactando o arquivo sitemap

Após criarmos vamos compactar o arquito sitemap.xml para sitemap.xml.gz. Para isso usaremos a função do PHP gzencode.

// Compactar arquivo sitemap para GZIP
$data = implode("", file("sitemap.xml"));
$gzdata = gzencode($data, 9);
$fp = fopen("sitemap.xml.gz", "w");
fwrite($fp, $gzdata);
fclose($fp);

Maravilha! Até agora vimos como criar o arquivo sitemap automaticamente buscando seus posts e gerando o XML e compactando no formato .gz. Esses dois arquivos são os que enviamos para o Google para que ele reconheça a estrutura do nosso site e melhore nosso SEO.

Enviando sitemap para o Google

Que tal fazer o envio automaticamente para o Google? Bora lá!

// Envia para o Google o novo sitemap gerado
$urlSitemap = "http://www.google.com/webmasters/sitemaps/ping?sitemap=" . HOME . "/";
// Arquivos a serem enviados
$Files = ['sitemap.xml', 'sitemap.xml.gz'];

// Envia os dois arquivos sitemap gerados para a URL do Google
foreach ($Files as $file) {
    $url = $urlSitemap . $file;
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
}

Nesse script definimos a URL do Google Webmaster e os arquivos a serem enviados.

No foreach verificamos os arquivos e enviamos um por vez para a URL utilizando a biblioteca cURL.

Para enviar ao Google você pode configurar o cron do Linux para executar semanalmente por exemplo, ou se adaptar às suas necessidades.

Bom galera espero que seja útil para vocês como é para mim. Caso queiram contribuir com melhorias e ou correções podem deixar um comentário abaixo.

Link do arquivo no GitHub: https://github.com/aristidesneto/sitemap-generation

Até a próxima!

 

Aristides Neto

Aristides Neto

Formado em Ciências da Computação, desenvolvedor back-end, esforçado no front-end e um entusiasta na área de gerenciamento de servidores Linux. Blogueiro novato com vontade de compartilhar conhecimentos para você mesmo!

Veja também