Un sitemap XML es un documento que contiene la relación de URLs de un sitio web, incluyendo su importancia relativa y la frecuencia con la que se modifican. Esta información permite a los motores de búsqueda, como Google y Yahoo, ajustar sus procedimientos de rastreo e indexación del sitio. En este artículo explicamos la manera de generar el sitemap y enviárselo a los principales motores de búsqueda de manera automatizada.
Formato de un sitemap XML
En el siguiente ejemplo vemos la estructura de un sitemap XML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.ejemplo.com/</loc> <lastmod>2012-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> <url> ... </url> ... </urlset> |
Como vemos, el sitemap contiene un elemento raíz «<urlset>», que consta de un conjunto de elementos «<url>». Cada uno de los elementos «<url>» debe contener un elemento «<loc>», y opcionalmente los elementos «<lastmod>», «<changefreq>» y «<priority>».
Generación del sitemap
La estructura de cada sitio web es diferente, por lo que no existe un único método de generación del sitemap que sea válido para todos. Ademas, parte de la información que aparece en el sitemap, como la frecuencia de cambio del contenido de una página o la prioridad de la misma, tiene que ser especificada durante la generación.
De todos modos, hay numerosas herramientas que ayudan a la generación de un sitemap, algunas de las cuales están recogidas en la página:
https://code.google.com/p/sitemap-generators/wiki/SitemapGenerators
Límites en el tamaño de un sitemap – sitemap index
Google impone un límite en el tamaño de un sitemap. El fichero no puede contener más de 50.000 URLs, y su tamaño descomprimido no puede ser superior a 50 MBytes.
Si un sitio web supera estos límites, debe generar varios sitemaps y crear un fichero «sitemap index» que los contenga. El siguiente es un ejemplo de un sitemap index del sitio «www.ejemplo.com», que contiene dos sitemaps «sitemap1.xml» y «sitemap2.xml»:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="UTF-8"?> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemap> <loc>http://www.ejemplo.com/sitemap1.xml.gz</loc> <lastmod>2012-10-01T18:23:17+00:00</lastmod> </sitemap> <sitemap> <loc>http://www.ejemplo.com/sitemap2.xml.gz</loc> <lastmod>2012-01-01</lastmod> </sitemap> </sitemapindex> |
Como vemos en el ejemplo, los sitemaps pueden estar comprimidos en formato gzip.
Envío del sitemap a Google
El sitemap puede ser enviado a Google de varias maneras:
- mediante Webmaster Tools
- incluyendo una referencia al mismo en el fichero «robots.txt».
- haciendo una solicitud HTTP GET a la url:
www.google.com/webmasters/tools/ping?sitemap=sitemap_url
En donde sitemap_url es la url del sitio, codificada con «URL Encode». por ejemplo, si el fichero sitemap se encuentra en la url:
1 2 3 |
http://www.ejemplo.com/sitemap.gz |
La solicitud HTTP GET se debe realizar a la url:
1 2 3 |
www.google.com/webmasters/tools/ping?sitemap=http%3A%2F%2Fwww.ejemplo.com%2Fsitemap.gz |
En PHP, podemos utilizar la función urlencode() para codificar la url, y utilizar file_get_contents() para realizar la solicitud HTTP:
1 2 3 4 5 6 7 |
$sitemapUrl = "http://www.ejemplo.com/sitemap.xml"; $pingUrl="http://www.google.com/webmasters/sitemaps/ping?sitemap=" . urlencode($sitemapUrl); echo "Google ping url: " . $pingUrl . "n"; $respuesta = file_get_contents($pingUrl); echo "Respuesta: " . $respuesta; |
Envío del sitemap a Bing
Bing utiliza el mismo mecanismo que Google para el envío del sitemap. Lo único que hay que modificar es la url a la que se hace la solicitud HTTP GET:
1 2 3 4 5 6 7 |
$sitemapUrl = "http://www.ejemplo.com/sitemap.xml"; $pingUrl="http://www.bing.com/webmaster/ping.aspx?siteMap=" . urlencode($sitemapUrl); echo "Bing ping url: " . $pingUrl . "n"; $respuesta = file_get_contents($pingUrl); echo "Respuesta: " . $respuesta; |
Referencias:
—
De donde sacas $respuesta? Creo que es $response :-/
Saludos
Hola abr4xas,
Gracias por apuntar el fallo. Ya está corregido en el cuerpo del artículo