lunes, 6 de agosto de 2012

Generando un Sitemap Dinamico en el website

Hola,

en primer lugar, necesitas saber que es y para que es un sitemap.

  • Sitemap es un protocolo,  esta es la URL principal que informa todo acerca de: http://www.sitemaps.org/protocol.html
  • Sitemap sirve (principalmente) para que el buscador (google), pueda saber que páginas existen en tu website y de ese modo pueda saber que contenidos tiene.

Ejemplo que muestra la necesidad de un sitemap:

Tienes un e-commerce, con cientos de productos en tu base de datos, OJO: en tu base de datos, no son páginas físicas, por tanto, si estan en tu base de datos cómo sabe google que productos tienes ?  Solución fácil...proveyendole un catálogo...si...pero vas a poner un catálogo con todos los productos ? no verdad ?.

(Nota para usuarios de Yii Framework: Yii trae el URL manager para que las url puedan escribirse de una forma SEO-Friendly, pero eso no basta...y es otra cosa totalmente distinta !)

Cómo entonces..bueno, me imagino que no estas pensando hacer una página html con el listado de todos los productos del e-commerce, por tanto ya me entendiste que habrá que hacerlo programáticamente:

Formato del Sitemap:

El archivo sitemap.xml es un archivo de texto con formato XML, es decir, su contenido esta escrito de forma que un programa consumidor de XML pueda entenderlo.

Este es el contenido de un archivo sitemap.xml:
<?xml version="1.0" encoding="UTF-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

   <url>

      <loc>http://www.example.com/</loc>

      <lastmod>2005-01-01</lastmod>

      <changefreq>monthly</changefreq>

      <priority>0.8</priority>

   </url>

</urlset> 

Si sigo el ejemplo del e-commerce y la requerida lista de productos para el buscador, entonces, por -cada producto- hallado en la base de datos de productos debe crearse -una entrada en el archivo sitemap.xml-....ojo de nuevo...no un archivo sitemap por cada producto.

Como se escriben las entradas de pagina en el sitemap ?

Si ves el ejemplo arriba, hay un forma: <url>....blabla....</url>   cada una de estas representa a un producto, por tanto el archivo sitemap final debería lucir así:

<?xml version="1.0" encoding="UTF-8"?>

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<!-- una de estas por cada producto: --> <url><loc>http://www.myecommerce.com/index.php?r=item/create&amp;idproduct=1&amp;amp;desc=descripcion aqui del producto </loc><changefreq>weekly</changefreq></url>
<!-- una de estas por cada producto: --> <url><loc>http://www.myecommerce.com/index.php?r=item/create&amp;idproduct=2&amp;amp;desc=descripcion aqui del producto </loc><changefreq>weekly</changefreq></url>
</urlset> 

Cómo lee la araña de google al archivo sitemap.xml ?

Leerá cada entrada <URL>..</Url> del archivo sitemap.xml, luego, ira a la URL indicada por la entrada <Loc>, mirará dentro de la URL (por tanto recibirás un GET a tu website proveniente de google) y finalmente analizará el contenido que esta página tenga.  Google hará cada vez que tu lo indiques, no siempre sino cuando tu lo indiques según el parámetro "changefreq".

Ahora,  si los productos cambian en mi website, debo crear cada vez un sitemap.xml nuevo ?

NO. Porque para eso está la tecnología.  Se hará en dos etapas:

1. Primero, pedirle a tu sitio web que mediante un comando haga "echo" (php) de un contenido XML cuando uno se lo pida. es decir, al ejecutar a mano la siguiente URL debe generarse dinámicamente un archivo sitemap.xml. (de nuevo...ojo..no estoy diciendo que vayamos a crear un archivo interno llamado sitemap.xml..no, sino emitir el contenido al browser directamente).

http://www.tuwebsite.com/index.php?r=site/sitemap 

2. Segundo, usando .htaccess, se hara que cuando al sitio web se le pida un archivo sitemap.xml este en cambio retorne lo que la url creada en el paso 1 emita.

para ello se crea en la raiz del site un archivo .htaccess con lo siguiente dentro:

RewriteEngine On
RewriteRule ^sitemap.xml? index.php?r=site/sitemap [L]

Verificacion de .htaccess

importante:  El servidor que aloja la pàgina debe admitir el mod_rewrite, para saber esto crea un archivo info.php con lo siguiente: "<?php echo phpinfo(); ?>" y correlo. Eso emitirá un listado de parametros de tu sitioweb. En ese resultado busca con el browser al palabra "mod_rewrite". Si aparece es porque el servidor soporta archivos .htaccess, si no aparece es porque no tiene instalado ese modulo y este tema no podrá continuarse.

Manejo de Headers para emitir contenido XML

cuando en el browser se tipea:  http://www.tuwebsite.com/index.php?r=site/sitemap

entonces este deberá emitir un archivo xml como salida.  cómo se hace esto ? con el manejo de los headers (al menos en php):

ejemplo:  crea un script cualquiera llamado prueba.php:

<?php 

header("Cache-Control: public");
header("Content-Description: Sitemap");
header("Content-Type: application/xml");


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

echo "<url>vacio</url>";

echo "</urlset>";
?>


cuando tu corres:   http://tuwebsite.com/prueba.php  se emitirá un cotenido que el browser iterpreta como XML.  esto es solo una demostración para que comprendas mejor lo que hare a continuación:

Generando el sitemap.xml desde un action en YiiFramework:

public function actionSitemap(){
header("Cache-Control: public");
header("Content-Description: Sitemap");
header("Content-Type: application/xml");

$a = "xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"";

echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<urlset $a>\n";

// lista (array) de todos los productos del site
$lista = Product::model()->findAll();

// url base, ejemplo:  http://www.miwebsite.com/
$baseUrl = Yii::app()->params['sitemap_baseurl'];

// frecuencia deseada, ejemplo: weekly
$changeFreq = Yii::app()->params['sitemap_changefreq']; // frecuencia

// por cada producto crear una entrada <url><loc>..</loc></url>
foreach($lista as $p){
$fullUrl = $baseUrl."index.php?r=item/create&idproduct=".$p->getPrimaryKey();
$fullUrl .= "&amp;desc=".$p->publicproductname;
$fullUrl = CHtml::encode($fullUrl);
echo "<url><loc>$fullUrl</loc><changefreq>$changeFreq</changefreq></url>\n";
}
echo "</urlset>\n";
}


Finalmente, si todo sale bien, cuando en tu site se hace esta consulta:

http://www.tuwebsite.com/sitemap.xml  

el browser deberá responder con una pagina en formato XML, indicativo de que todo salió bien.

Lo que sucede internamente es que:

1. tu tipeas:   http://www.tuwebsite.com/sitemap.xml

2. tu servidor recurre al .htaccess para "mapear" tu "request" y convertirlo internamente en:
   http://www.tuwebsite.com/index.php?r=site/sitemap

3. tu action (caso yiiframework) siteController.php::actionSitemap se ejecuta y devuelve con "echo" el contenido del sitemap, y el hecho de haber puesto los "headers" hace que el browser reconozca este contenido como XML.

suerte.

2 comentarios:

  1. Si en lugar de crear las URL a pelo, utilizaras el createURL, el sistema seria mas facil de mantener, y, sobre todo garantizarias el formato correcto

    ResponderEliminar
    Respuestas
    1. cierto 100%. al momento de hacer el ejemplo no conocia las fallas que se derivaban al no dejar a yii hacer las URL como tu indicas.

      Eliminar