Construcción de un archivo sitemap a partir de PHP

  • Por
Vamos a construir paso a paso un archivo sitemap.xml a partir de PHP y una base de datos MySQL.
Continuando la línea de nuestro manual sobre sitemaps vamos a ver como se puede hacer un archivo de sitemaps a partir de un script PHP y una base de datos MySQL. Esta opción, obviamente, resulta más laboriosa que utilizar un programa para generar el sitemap automáticamente, pero en ciertos casos puede que nos venga bien, porque podremos mantener un control total sobre los contenidos que incluimos dentro del archivo de sitemap.

Partimos de un supuesto, en el que tenemos una tabla donde se almacenan los artículos publicados en nuestra web. En esa tabla tenemos un identificador del artículo, un titulo, fecha de modificación o creación y una ruta del mismo. Aparte, en la tabla podrá haber otros datos, como el contenido o cuerpo del propio artículo, la clasificación, etc, pero en principio esos datos no nos interesan para hacer el sitemap.

Lo primero que tenemos que hacer es sacar un listado de todos los artículos que tenemos realizando una simple sentencia sql:

$ssql="select * from articulos";

A continuación y antes de meternos en un while para recorrer el resultado de esta sentencia, vamos a crear el código de la cabecera del archivo .xml:

$codigo='<?xml version="1.0" encoding="UTF-8"?>
   <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

Nota: estas lineas con la cabecera del archivo XML del sitemap las tenemos explicadas en el articulo “Creación de un archivo sitemaps de forma manual”.

Una vez que tenemos el código inicial en una variable pasamos a ejecutar la sentencia SQL para extraer los artículos y a recorrer los resultados de la búsqueda en base de datos, para ir guardando las rutas de los artículos.

$rs=mysql_query($ssql);
$total=mysql_num_rows($rs);
while($fila=mysql_fetch_object($rs)){
   $codigo .='<url>
   <loc>'. $fila->ruta;
   $codigo .='</loc>
   <lastmod>'.$fila->fecha.'</lastmod>
   <changefreg>never </changefreg>
   <priority>0.7</priority>
   </url>';
}

Con esto ya tendríamos nuestro listado de URL que muestran artículos. La sintaxis de los archivos sitemaps ya se explicó en el articulo Creación Manual de un archivo sitemaps, por lo que no debería haber dudas en ese sentido. Básicamente en ese código vamos ir recorriendo los resultados de la sentencia y añadiendo URLs de cada uno de los artículos de la base de datos, especificando la ruta del archivo, la fecha de modificación, la frecuencia de modificación y la prioridad de cada URL.

Por último nos queda cerrar el código del archivo .xml con la siguiente linea:

$codigo .='</urlset> ';

Con esto tendríamos nuestro código terminado, nos quedaría crear el archivo y darle los permisos necesarios, así como ubicarlo en la raíz de nuestra web,

$path = "http://www.loquesea.com/sitemap.xml";
$modo = "w+";

if ($fp=fopen($path,$modo))
{
   fwrite ($fp,$codigo);
   echo "<p><b>Archivo creado correctamente</b>";
}
else{
   echo "<p><b>Ha habido un problema y el archivo no ha sido abierto</b>";
}

Nota: Si no entendéis el sistema de creación y apertura de un archivo en PHP podéis repasar el artículo Escritura en archivos de texto con PHP.

A continuación os dejo el código completo que nos construiría un archivo de texto en formato XML para generar el sitemap de nuestro sitio, que listaría todos los artículos de la web.

<html>
<head>
   <title>Creación de sitemaps para articulos</title>
</head>

<body>
<h1>Sitemaps</h1>
Aqui estamos creando un archivo .xml para los sitemaps de artículos.

<?
//Sentencia que nos saca todos los artículos que tenemos en nuestra base de datos.
$ssql="select * from articulo";

//Creamos la cabecera del .xml
$codigo='<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

$rs=mysql_query($ssql);
$total=mysql_num_rows($rs);
while($fila=mysql_fetch_object($rs)){
   $codigo .='<url>
    <loc>'.$fila->ruta;
   $codigo .='</loc>
   <lastmod>'.$fila->fecha.'</lastmod>
   <changefreg>'.$fila->fecha.' </changefreg>
   <priority>0.7</priority>
   </url> ';
}
$codigo .='</urlset> ';

//Ahora creamos el archivo con el código necesario
$path = "http:www.loquesea.com/sitemap.xml";
$modo = "w+";

if ($fp=fopen($path,$modo))
{
   fwrite ($fp,$codigo);
   echo "<p><b>Archivo sitemap creado correctamente</b>";
}
else{
   echo "<p><b>Ha habido un problema y el archivo no ha sido creado correctamente</b>";
}

?>
<p>

</body>
</html>

Esperamos que estas notas hayan resultado de interés para poder aclarar cómo realizar con programación PHP el sitemap de vuestra web. En este caso hemos listado sólo las páginas de artículos, pero claro que si la web tiene otras secciones, aparte de la de artículos, tendríamos que generar el sitemap para que también listara las páginas de esas otras secciones, o realizar varios archivos sitemap.