Archivo de la etiqueta: SEO

Resuelto el misterio de la indexación

[blog] [internet]

Hará cosa de un mes Google dejó de indexarme. No solo eso, sí no que además eliminó todas las búsquedas a este blog. El mensaje en las herramientas para Webmasters era el siguiente:

Es posible que este sitio esté cometiendo una infracción de las directrices de calidad de Google

Revisé las directrices y no vi nada raro, así que rellené un formulario para que lo reconsideraran. Pasados unos días me llegó una respuesta automática indicando que se reconsideraría y que el proceso podría tardar unas semanas…..

Hoy, ya harto de esperar y que la situación no cambiara, me he puesto a investigar, y menuda sorpresa me he llevado…

Google ha expulsado todas las direcciones con dominio CO.CC!!!

En realidad las expulsó todas el 7 de julio, como se explica en esta noticia de El Pais.

WTF! Señor Google, tan difícil era dar alguna pista en las herramientas para Webmasters??? No se, algo del tipo “Su domino no será indexado por bla, bla, bla…”

Pues nada, cambio de dominio al canto. Buscaré otro gratuito, y si no me paso a un .com

Que forma más tonta de empezar el día cabreado…..

Crear un sitemap.xml de forma dinámica con PHP

[programación]

Siguiendo con las optimizaciones para mejorar la indexación por parte de Google, vi en las herramientas que proporciona Google a webmasters que se puede proporcionar un sitemap en formato xml para que Google pueda rastrear con mayor facilidad algunas páginas de difícil rastreo.

En teoría, con la actualización de las Friendly URLs ya no tengo páginas de difícil rastreo, pero viendo que no me indexa, pues mejor dar todas las facilidades posibles.

Lo primero que hice fue crear un sitemap.xml mediante esta página.

La página se encarga de rastrear el sitio y obtener el listado de enlaces y te genera un xml para descargar. Después se deja en la raíz del blog, y ya es accesible en la ruta /sitemap.xml.

El problema es que según se generan nuevos artículos, tendría que estar volviendo a generar manualmente el sitemap. Además, aparecían enlaces que no estoy especialmente interesado en que se indexen, como las etiquetas o la página de registro.

La solución, por tanto, es que el sitemap se genere de forma dinámica. Estuve buscando generadores de sitemap en PHP y al final encontré este tutorial de como hacer el tuyo propio. Lamentablemente el tutorial ya no está disponible.

Usando ese código como base y el sitemap.xml que había generado con la primera página como plantilla, lo he adaptado para poder funcionar con la base de datos de eggBlog.

Al final, solo añado las URLs de los artículos, ya que son mi prioridad en la indexación, pero no debería ser complicado modificar el código para añadir más enlaces.

[ACTUALIZACIóN 05/03/2011]

He realizado algunas modificaciones al sitemap.php. Anteriormente estaba utilizando la fecha de publicación como la fecha de modificación el el sitemap, pero claro, yo quiero indicar a Google que un articulo ha sido actualizado, por lo que necesito tener una fecha de modificación. Para eso añadí una nueva columna a la tabla “eb_articles” con el nombre “mod_date”.

Hay que establecer su valor en dos métodos, eb_admin_editarticle y eb_admin_newarticle, ambos en admin.php. Simplemente hay que añadir .",mod_date="".time(). en el INSERT.

También es interesante añadirlo a la definición de la tabla en el método eb_install para una futura migración o reinstalación. Solo hay que añadir:

"mod_date int NOT NULL DEFAULT '0',".

Por si alguien lo quiere aprovechar, aquí os dejo el código para descargar. Me ha tocado subirlo como un txt, ya que no me deja subir ficheros zip… ¬

[ACTUALIZACIóN 11/10/2011]

Con tanto cambio de servidor, el fichero zip se perdió en algún lado, así que a continuación pongo la útima versión que hice para eggBlog. Para wordpress lo mejor es optar por un plugin como el Google (XML) Sitemap Generator.

<?php
require_once "_lib/global.php";
header( "Content-Type: text/xml;charset=iso-8859-1" );

// Connectamos con la base de datos
mysql_connect( $config['mysql_host'], $config['mysql_user'], $config['mysql_pass'] );
@mysql_select_db( $config['mysql_db'] ) or die( "Unable to select DB" );

// Realizamos la consulta
$sql = "SELECT article_id, mod_date, article_title, article_date"
." FROM eb_articles"
." WHERE article_flag = 1 OR article_flag = 2"
." ORDER BY article_date DESC";
$query = mysql_query( $sql ) or die( "Query failed" );

// Escribimos la cabezera del xml
echo '<?xml version="1.0" encoding="UTF-8"?>
    <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">';

$maxArticleDate = 0;
settype( $maxArticleDate, "integer" );

while( $row = mysql_fetch_array( $query ) ) {

    // Obtenemos la Friendly URL del articulo
    $article_link = eb_links_article( $row['article_title'], $row['article_id'] );

    // Componemos la fecha de modificación (p.e. 2011-02-18)
    $year = date( "Y", $row[1] );
    $mon  = date( "m", $row[1] );
    $day  = date( "d", $row[1] );

    $lastModDate = $year . '-' . $mon . '-' . $day;

    echo
        '<url>
            <loc>' . $article_link . '</loc>
            <lastmod>' . $lastModDate . '</lastmod>
            <changefreq>monthly</changefreq>
        </url>';

    $articleDate = $row['article_date'];
    settype( $articleDate, "integer" );
    if( $articleDate > $maxArticleDate ) {
        $maxArticleDate = $articleDate;
    }
}

mysql_close(); //Cerramos la conexión

$year = date( "Y", $maxArticleDate );
$mon  = date( "m", $maxArticleDate );
$day  = date( "d", $maxArticleDate );

$lastCreateDate = $year . '-' . $mon . '-' . $day;

echo
    '<url>
        <loc>' . $config['domain'] . 'index.php</loc>
        <lastmod>' . $lastCreateDate . '</lastmod>
        <changefreq>daily</changefreq>
    </url>';

echo '</urlset>';
?>

¿Indexa Google las páginas PHP?

[programación]

En teoría sí, pero por alguna razón a mi no.

Encontré este artículo que trata el tema de la indexación de páginas PHP por parte de Google y esclarece muchos de los mitos.

Ahí se explica que no debería haber ningún problema con las páginas generadas dinámicamente, pero en el caso de eggBlog, no parece indexar los artículos. En este caso se accede a los artículos a través de la página news.php y una ID, por ejemplo:

http://tu-dominio.com/news.php?id=12

Parece que el consenso general es que Google tiene problemas, o se esfuerza menos, en indexar páginas que tienes más de 2 parámetros, pero en mi caso solo tengo 1, el id, y no debería dar problemas…

El caso es que en el foro de eggBlog encontré un hilo en el que comentaban como sustituir la utilización de IDs por Friendly URLs. El usuario Faris se curró una modificación para el blog para implementar las Friendly URLs

Tras probar la modificación, estaba casi a punto, pero daba un fallo al intentar ir a los enlaces. Parecía cosa del .htaccess, así que tras investigar un poco encontré la respuesta. Solo hacía falta añadir esta linea:

RewriteBase /

El código completo del .htaccess por si alguien lo necesita es el siguiente:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule .*-([0-9]+).htm$ news.php?id=$1 [L]
RewriteRule .*-([0-9]+)/$ news.php?id=$1
RewriteRule (.*)-([0-9]+)$ $1-$2/ [R]
RewriteRule .*/([0-9]+)/$ news.php?id=$1
RewriteRule (.*)/([0-9]+)$ $1/$2/ [R]

Y aquí la página que suelo usar para trabajar experimentar con expresiones regulares.

El resultado final es que los enlaces a la derecha que van a los articulos muestran en la URL el nombre del artículo y el rastreador de Google debería de entrar en todos. A ver que tal en la próxima indexación…

[ACTUALIZACIÓN 15/02/2011]

Es irónico que la entrada que habla sobre Friendly URLs tenga una que justamente falla. ¿El problema? Pues que se está utilizando el título de la entrada como URL y ahí tengo un bonito interrogante (?), que se usa para pasar parámetros… y peta. Al principio pensaba que también estaban afectando el otro interrogante y el acento, pero solo quitando el interrogante de cierre se ha solucionado, aunque la URL ya no quedaba “bonita” ya que los caracteres especiales se sustituían por su código, por lo que he acabado sustituyendolos todos.

El método eb\_links\_article del fichero _lib/global.php queda así:

// F4ris - 20090708 - Function to produce SEO friendly links, dependant on config flag.
function eb_links_article( $title,$id ) {
    global $config;
    if( $config['seo_flag'] == 1 ) {
        $unsuportedChars = array( "&aacute;", "&eacute;", "&iacute;", "&oacute;", "&uacute;", "&iquest;", "?" );
        $suportedChars = array("a", "e", "i", "o", "u", "", "");
        $tmpTitle = str_replace( $unsuportedChars, $suportedChars, $title );
        $link = $config['domain'] . urlencode( str_replace(" ", "-", str_replace( " - ", "-", $tmpTitle ) ) ) . "-" . $id . ".htm";
    } else {
        $link = $config['domain'] . "news.php?id=" . $id;
    }
    return $link;
}