Crear sitemap y enviarlo a buscadores con PHP y MySql

El sitemap es una herramienta muy útil para el webmaster dado que permite enviar a los buscadores la dirección exacta de cada página y publicación de nuestro sitio de modo que sea prontamente indexado, sin embargo realizar un satimap de manera manual se vuelve un trabajo largo y sumamente tedioso en la medida en que nuestro sitio crece.

Existen varias formas de hacer un sitemap ahorrando tiempo, y una de ellas, útil si tenemos cada publicación de nuestra página en una base de datos MySql, es crear el sitemap dinámicamente, pudiendo incluso enviarlo a los buscadores con tan solo un click.

lo primero que necesitamos, como dije, es tener todas las entradas del sitio en una tabla de la BD, la tabla de el ejemplo se llama «publicaciones», esta tabla contiene diferentes datos dependiendo de la forma en que trabaja el sitio pero de allí únicamente tomaremos los enlaces, colocados en la columna «enlace» de la tabla, he aquí el script:

<?php
// Conectamos a la Base de Datos
include("include/MySQL.class.php");
// Creamos objeto Base de datos
$BD= new MySQL();
// Consulta a la BD
$consulta = $BD->consulta("SELECT * FROM publicaciones ORDER BY fecha DESC");
while ($resultados = $BD->fetch_array($consulta)){
	$noticias[]=$resultados;}
// Instanciamos las etiquetas y valores en una sola variable
$sitemap ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n";
$sitemap .="<urlset xmlns=\"http://www.google.com/schemas/sitemap/0.84\">\r\n";
$sitemap .="<!-- Last update of sitemap ".date (DATE_W3C)." -->\r\n";
$sitemap .="<url>\r\n";
$sitemap .="<loc>http://www.tu-dominio.com</loc>\r\n";
$sitemap .="<changefreq>daily</changefreq>\r\n";
$sitemap .="<lastmod>".date (DATE_W3C)."</lastmod>\r\n";
$sitemap .="
<priority>1.0</priority>\r\n";
$sitemap .="</url>\r\n";
//Colocamos cada página estática del sitio, como por ej, las Categorías
$sitemap .="<url>\r\n";
$sitemap .="<loc>http://www.tu-dominio.com/categoria-001.php</loc>\r\n";
$sitemap .="<changefreq>daily</changefreq>\r\n";
$sitemap .="<lastmod>".date (DATE_W3C)."</lastmod>\r\n";
$sitemap .="
<priority>0.9</priority>\r\n";
$sitemap .="</url>\r\n";
//Agregamos cada publicación nueva sacando los datos desde MySql
foreach($noticias as $noticia){
$fecha=$noticia['fecha'];
$sitemap .="<url>\r\n";
$sitemap .="<loc>http://www.tu-dominio.com/".$noticia['enlace']."</loc>\r\n";
$sitemap .="
<priority>0.8</priority>\r\n";
$sitemap .="</url>\r\n";
}
$sitemap .="</urlset>\r\n";
//escribimos el archivo sitemap.xml en el directorio raíz
$fichero= fopen("sitemap.xml" , "w");
// escribimos la variable creada en el fichero sitemap.xml
fwrite($fichero, $sitemap);
// cerramos el fichero sitemap.xml
fclose($fichero);
// cerramos la BD
$BD->close();
//Hacemos un ping a las las url de los buscadores para avisar Google, Yahoo y Ask
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://search.yahooapis.com/SiteExplorerService/V1/ping?sitemap=http://www.tu-dominio.com/sitemap.xml');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
curl_close($ch);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/webmasters/sitemaps/ping?sitemap=http://www.tu-dominio.com/sitemap.xml');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
curl_close($ch); 				

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://submissions.ask.com/ping?sitemap=http%3A//www.tu-dominio.com/sitemap.xml');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
curl_close($ch);
echo "
<fieldset style=\"background-color:#CCCCCC; width:300px; margin:auto; vertical-align:middle; margin-top:10%;text-align:center;-moz-border-radius:16px;-webkit-border-radius:16px;border-radius:16px;-moz-box-shadow:0 0 3px #CCCCCC;-webkit-box-shadow:0 0 3px #CCCCCC;box-shadow:0 0 3px #CCCCCC;\">
<h3>Tu sitemap ha sido enviado correctamente a los buscadores determinados.</h3>

<a href=\"http://www.tu-dominio.com/sitemap.xml\" target=\"_blank\">VER SITEMAP</a>

<a href=".$_SERVER['HTTP_REFERER'].">VOLVER</a>
</fieldset>

";
?>

Y la clase para conectar a la base de datos es esta:

<?php
class MySQL{
 private $conexion;
  private $total_consultas;
 public function MySQL(){
  if(!isset($this->conexion)){
  $this->conexion = (mysql_connect("servidor-de-tu-BD","usuario","pass")) or die(mysql_error());
  mysql_select_db("nombre-de-la-BD",$this->conexion) or die(mysql_error());
  }
  }
 public function consulta($consulta){
  $this->total_consultas++;
  $resultado = mysql_query($consulta,$this->conexion);
  if(!$resultado){
  echo 'MySQL Error: ' . mysql_error();
  exit;
  }
  return $resultado;
  }
 public function fetch_array($consulta){
  return mysql_fetch_array($consulta);
  }
 public function num_rows($consulta){
  return mysql_num_rows($consulta);
  }
 public function getTotalConsultas(){
  return $this->total_consultas;
  }
  public function close(){
  if ($this->conexion){
  return mysql_close($this->conexion);
  }}
  }

?>

El funcionamiento es simple, nada más colocamos un link hacia el archivo «sitemap.php» en alguna parte del panel de administración de nuestro sitio, y al hacer click en él automaticamente se creará el sitemap y será enviado a los buscadores, luego de lo cual se mostrará el aviso de que la operación se realizó con éxito. Yo mismo he estado usando este script desde hace algun tiempo en uno de mis sitios y funciona sin problemas, si alguien tiene alguna pregunta no dude en escribirme.

Un comentario sobre “Crear sitemap y enviarlo a buscadores con PHP y MySql

  • el 12 diciembre, 2011 a las 12:02 AM
    Permalink

    Genial amigo muchas gracias me estaba ppor volver loco buscando

    Respuesta

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.