Gerando sitemap dinâmicamente com PHP

Gerando sitemap dinâmicamente com PHP
3.9 17

Todos devem saber que o sitemap é uma ferramenta extremamente usada pelos robôs de busca (google, yahoo, etc...). O próprio nome denota o que ele é, é o mapa do site, ou seja, tudo que existe no site, e que deve ser indexado deve ser constar no sitemap.

Óbvio que se você não tiver um sitemap seu site será indexado também, mas no mundo atual quanto mais você facilitar a vida dos robôs de busca, melhor você será recompensando.

Aqui vou mostrar um forma simples de gerar o sitemap de forma dinâmica com PHP, MySQL e usando o .htaccess. Vou usar como base o arquivo que gera o XML do sitemap do nosso site, você pode ver ele aqui.

Tudo que é cadastrado no site, principalmente na parte do blog, entra automaticamente no XML do sitemap, no caso esse arquivo sitemap.xml sequer existe no servidor, ele é apenas uma máscara feita com o uso do mod_rewrite do apache, isso usando o .htaccess.

<?php
header("Content-Type: application/xml; charset=UTF-8");
echo '<?xml version="1.0" encoding="UTF-8"?>';

$hoje = date('Y-m-d');
?>

<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>http://www.edgarserra.com/</loc>
  <lastmod><?php echo $hoje;?></lastmod>
  <priority>1.00</priority>
  <changefreq>daily</changefreq>
</url>
<url>
  <loc>http://www.edgarserra.com/index.jsp</loc>
  <lastmod><?php echo $hoje;?></lastmod>
  <priority>0.80</priority>
  <changefreq>daily</changefreq>
</url>
<url>
  <loc>http://www.edgarserra.com/quem-somos.jsp</loc>
  <lastmod><?php echo $hoje;?></lastmod>
  <priority>0.80</priority>
  <changefreq>daily</changefreq>
</url>
<url>
  <loc>http://www.edgarserra.com/servicos.jsp</loc>
  <lastmod><?php echo $hoje;?></lastmod>
  <priority>0.80</priority>
  <changefreq>daily</changefreq>
</url>
<url>
  <loc>http://www.edgarserra.com/blog.jsp</loc>
  <lastmod><?php echo $hoje;?></lastmod>
  <priority>0.80</priority>
  <changefreq>daily</changefreq>
</url>
<url>
  <loc>http://www.edgarserra.com/arquivo-do-blog.jsp</loc>
  <lastmod><?php echo $hoje;?></lastmod>
  <priority>0.80</priority>
  <changefreq>daily</changefreq>
</url>
<url>
  <loc>http://www.edgarserra.com/orcamento.jsp</loc>
  <lastmod><?php echo $hoje;?></lastmod>
  <priority>0.80</priority>
  <changefreq>daily</changefreq>
</url>
<url>
  <loc>http://www.edgarserra.com/contato.jsp</loc>
  <lastmod><?php echo $hoje;?></lastmod>
  <priority>0.80</priority>
  <changefreq>daily</changefreq>
</url>
	<?php
	
/*
Conecta ao banco de dados... essa parte você acha fácil na internet.
*/
$sql_tabela = mysql_query("SELECT id,titulo FROM TABELA ORDER BY id DESC");

	while($tabela = mysql_fetch_assoc($sql_tabela)){
echo "<url>
		<loc>http://www.edgarserra.com/".$tabela['id']."/".$tabela['titulo'].".jsp</loc>
		<lastmod>".$hoje."</lastmod>
		<changefreq>daily</changefreq>
		<priority>0.6</priority>
	</url>";
}
	?>
</urlset>


Como disse acima, no servidor de fato não existe nenhum arquivo chamado sitemap.xml, usamos o mod_rewrite para "criar" esse arquivo artificial, para isso basta:

RewriteEngine On
RewriteRule ^sitemap\.xml$ gera_xml.php [L]

Copie isso e cole em um arquivo chamado .htaccess (note que ele não tem nome mesmo, é só extensão, você pode renomear ele assim no FTP do seu site, pois no Windows você não conseguirá criar um arquivo sem nome. Esse arquivo deve ser jogado na raiz do seu site.

No caso quando for requisitado o sitemap.xml ele vai redirecionar a requisição para o gera_xml.php, o importante é você colocar o código que gera o xml dentro de um arquivo chamado gera_xml.php, ou alterar esse nome no código passado acima.

A idéia desse pequeno artigo foi mostrar como é simples fazer um sitemap dinâmico, é claro que ele terá que ser adapatado para a realidade do seu site, mas agora é com você.

Comentários (17)

  • Matheus

    Muito massa, apliquei usando o IIS7 e funcionou tudo certinho. Muito obrigado pela dica!

    05 de Janeiro de 2016 às 16:21
  • Iris P. Nascimento

    Cara, muito obrigado por tudo. Não gosto do worpress pq eu acho ele bem limitado e muito dificil de se mexer, então resolvi criar meu site do zero. Baseado em uma template qualquer que pequei na net e estou criando o Banco de dados Mysql + Php pra esse meu site puro. Está filé, e agora acabou de completar tudo que eu precisava. Olhe ai como ficou: top10afiliados.com/sitemap.php ou sem o site map: top10afiliados.com. Valeu e muito obrigado. Fiquei seu fã.

    24 de Novembro de 2015 às 22:44
  • Vinicius

    Muito Obrigado, pela dica.

    Funciono tudo direito.

    Fiz algumas modificações para o wordpress.

    para o select mostrar os posts e pages do wordpress.

    SELECT post_name FROM wp_posts WHERE post_status="publish" AND (post_type="page" OR post_type="post") ORDER BY "id" DESC'

    27 de Agosto de 2015 às 23:23
  • Felipe Chiarotti

    Olá amigo, não estou conseguindo implementar em meu site o código. o gera_xml.php entra normal e funciona como um xml. E agora o que devo fazer?

    04 de Março de 2015 às 21:39
  • Best Top PTC Website

    Criei uma pagina sitemap no meu blogger: http://besttopptcwebsites.blogspot.pt/p/sitemap.html e colei o codigo html gerado por um site criador de sitemaps. Não me parece que a pagina esteja bem criada porque mudou significamente o modelo da página em relação ao resto do site. Como farei para emendar este erro?

    04 de Fevereiro de 2014 às 22:40
  • Alexandre Broggio

    Vlw pela dica funcinou muito bem aqui para meu sistema.

    24 de Abril de 2013 às 12:22
  • eric

    E se as urls ultrapassarem o limite? seila 45000 ou mais?

    23 de Fevereiro de 2013 às 09:03
    • Edgar Serra

      Eric, neste caso você terá que criar uma sitemap paginado e enviar isto para o google.

      23 de Fevereiro de 2013 às 13:03
  • Alan Douglas

    Edgar, acontece que o .htaccess já está funcionando normalmente no servidor. Vou explicar na prática: Tenho o .htaccess que funciona normalmente, assim que eu acrescento a linha "RewriteRule ^sitemap\.xml$ gera_xml.php [L] " e upo o .htacess o site dá erro 500. Se eu retiro essa linha e reupo o .htaccess ele não volta, continua com o erro 500. O site só volta a funcionar se eu reupar o arquivo original .htaccess. Muito estranho. Saberia dizer o que pode ser?

    18 de Julho de 2012 às 12:36
  • Ronaldo

    Ola teria como vc me ajudar fui tentar colocar esse sitemap no google pela ferramenta de webmasters mais la aparece esse erro Parsing error com essa mensagem
    We were unable to read your Sitemap. It may contain an entry we are unable to recognize. Please validate your Sitemap before resubmitting.

    olha o site onde esta o sitemap
    se puder me ajudar mande me um e-mail

    http://tropadeelitemaster.netne.net/sitemap.xml

    02 de Julho de 2012 às 16:37
    • Edgar Serra

      Ronaldo, existe uma linha em branco no seu XML, este é o problema.

      12 de Julho de 2012 às 10:22
  • Alan Douglas

    Tenho um caso muito estranho acontecendo comigo. Tenho alguns sites que funcionam perfeitamente, porém em outros, ao colocar essa linha "RewriteEngine On" no .htaccess, simplesmente o site sai fora do ar. O mais estranho é: Se eu RETIRAR a linha "RewriteEngine On" o site NÃO VOLTA. Só volta se eu voltar pro ar o Backup do .htaccess.

    Engraçado é que tenho outros sites que o mesmo processo funciona perfeitamente.

    Saberia dizer o que é?

    30 de Abril de 2012 às 08:32
    • Edgar Serra

      Alan, é provável que neste caso, o mod_rewrite não esteja ativa no httpd.conf do servidor.

      30 de Abril de 2012 às 20:50
  • Luan Mateus

    Belo post.

    Eric e Roger, para resolver esse problema você coloca assim header("Content-type: text/xml"); antes de iniciar o XML. ;)

    Fiquem com Deus, abraços!!

    20 de Março de 2012 às 14:38
  • Roger

    mesma coisa que deu com eric está dando aqui!, no IE pega normal mas no Firefox e no chrome nada... e está tudo certo oque deve ser :s

    24 de Janeiro de 2012 às 12:10
  • Eric

    Ola olha o sitemap não entra no chrome e firefox....só no ie...pq?

    10 de Novembro de 2011 às 16:27
    • Edgar Serra

      Eric, é provável que você não esteja informando o header de forma correta.

      20 de Novembro de 2011 às 17:35

Comente =)

Atenção: Todos os comentários são moderados, por isto não perca seu tempo postando bobagens ou spam.