Internet se está poniendo mas «madura», y existen muchos sitios «antiguos» que siguen funcionado con sistemas de administración anticuados, armados a medida hace una década.

Hace 10 años, las cosas se hacían de otra manera. Las tablas eran el método más común de maquetar, el HTML se escribía con FrontPage, no existía Facebook, no existía Twitter. Los conceptos de SEO eran totalmente diferentes. Y la forma de programar un administrador de contenidos era muy diferente. En este tiempo han cambiado tanto las cosas, que si tuviéramos que enumerar los avances no sabríamos por dónde empezar.

La tarea de rediseñar un sitio web antiguo es cada vez más común. Y con cada rediseño aparece la frase: migración de datos. O cómo mover los contenidos de un sistema a otro.

Cada migración es un caso único, algunos sitios tienen 10 o 12 páginas de contenidos, y en esos casos se puede hacer a mano. Pero otros sitios tienen muchísimo contenido publicado, y hacerlo a mano llevaría meses de trabajo. ¿Cómo hacemos en estos casos?

En este momento estamos trabajando en una de migración de un CMS a medida. El CMS lo hicimos nosotros en el año 2003! El sitio ha envejecido con dignidad, pero ahora está en el proceso de ser renovado totalmente. Estamos rearmando todo el sistema usando WordPress. El sitio tiene alrededor de 1000 artículos publicados, todos guardados prolijamente en su base de datos, pero en un formato que WordPress no entiende.

A partir de este artículo de Yoast que básicamente nos resolvió el problema, armamos un script en PHP para levantar el contenido de nuestra base de datos, corregir y formatear los datos, y volcarlo en WordPress.

Este script puede tener cualquier nombre, pero tiene que estar dentro de la carpeta de instalación del WordPress de destino, ya que vamos a llamar algunos archivos de WP para poder usar algunas funcionalidades

<?php
// primero nos conectamos a la DB de origen
$db_name="el_nombre_de_la_db";
$db_username="el_usuario";
$db_password="la_contraseña";
$db_host="localhost";
$link = mysql_connect($db_host, $db_username, $db_password) or die ("Database no found");
mysql_select_db($db_name,$link);

// en este caso, vamos a importar desde la tabla "noticias"
$results = mysql_query("SELECT * FROM noticias");
$i = 0;
while ($row = mysql_fetch_array($results)) {
$post = array();
$post['post_status'] = 'publish';

// Como la fecha no estaba en formato DATETIME, escribimos esta
// rutina para convertirla al formato correcto
$fecha = explode(" ", $row['fecha']);
$dia = $fecha[0];
$mes = $fecha[1];
$ano = $fecha[2];
$dia = str_pad($dia, 2, '0', STR_PAD_LEFT);

if($mes == 'ene' || $mes == 'Ene' || $mes == 'Enero') {$mes = '01';}
if($mes == 'feb' || $mes == 'Feb' || $mes == 'Febrero') {$mes = '02';}
if($mes == 'mar' || $mes == 'Mar' || $mes == 'Marzo') {$mes = '03';}
if($mes == 'abr' || $mes == 'Abr' || $mes == 'Abril') {$mes = '04';}
if($mes == 'may' || $mes == 'May' || $mes == 'Mayo') {$mes = '05';}
if($mes == 'jun' || $mes == 'Jun' || $mes == 'Junio') {$mes = '06';}
if($mes == 'jul' || $mes == 'Jul' || $mes == 'Julio') {$mes = '07';}
if($mes == 'ago' || $mes == 'Ago' || $mes == 'Agosto') {$mes = '08';}
if($mes == 'sep' || $mes == 'Sep' || $mes == 'Septiembre') {$mes = '09';}
if($mes == 'set' || $mes == 'Set' || $mes == 'Setiembre') {$mes = '09';}
if($mes == 'oct' || $mes == 'Oct' || $mes == 'Octubre') {$mes = '10';}
if($mes == 'nov' || $mes == 'Nov' || $mes == 'Noviembre') {$mes = '11';}
if($mes == 'dic' || $mes == 'Dic' || $mes == 'Diciembre') {$mes = '12';}
$post['post_date'] = ''.$ano.'-'.$mes.'-'.$dia.' 12:00:00';
$post['post_date_gmt'] = ''.$ano.'-'.$mes.'-'.$dia.' 12:00:00';

// aca se pone el ID de la categoría en WP, en este caso 1
// se pueden importar los posts en cualquier categoría
$post['post_category'] = array(1);

//Los títulos tenian comillas en algunos casos, se las sacamos.
$titulo = str_replace('"', "", $row['titulo']);

$titulo = str_replace("'", "", $titulo);
$post['post_title'] = strip_tags(utf8_encode($titulo));
$post['post_excerpt'] = utf8_encode($row['intro']);
$post['post_content'] = utf8_encode($row['texto']);

// también se puede importar a un custom post type, sólo hay que
// descomentar esta linea y poner el nombre del custom post type
//$post['post_type'] = 'nombre_del_custom_post_type';

$posts[$i] = $post;
$i++;
}
mysql_free_result($results);
mysql_close($link);

// el archivo tiene que estar dentro de la carpeta de
// instalacion de wordpress
require('./wp-load.php');
$n = 1;
foreach ($posts as $post) {
wp_insert_post($post);
echo $n.'--'.$post['post_date'].'---'.$post['post_title'].'---<br>';
$n ++;
}

?>

Este script nos permitió en sólo 2 horas de trabajo, importar casi 1000 artículos a una instalación de WordPress, utilizando dos tipos de contenido diferentes.

Por supuesto, luego de semejante volcado de datos, siempre hay que controlar que esté todo en su lugar, pero es un punto de partida muy bueno para cualquier migración.

Internet se está poniendo mas «madura», y existen muchos sitios «antiguos» que siguen funcionado con sistemas de administración anticuados, armados a medida hace una década.

Hace 10 años, las cosas se hacían de otra manera. Las tablas eran el método más común de maquetar, el HTML se escribía con FrontPage, no existía Facebook, no existía Twitter. Los conceptos de SEO eran totalmente diferentes. Y la forma de programar un administrador de contenidos era muy diferente. En este tiempo han cambiado tanto las cosas, que si tuviéramos que enumerar los avances no sabríamos por dónde empezar.

Read More

2 Comments

  • Avatar Carazo dice:

    Veo un fallo en todo esto y es que podría haberse usado directamente un plugin WordPress. No veo elegante hacer el wp-load.php directamente.

    Aparte están las llamadas a las funciones mysql_ en lugar de usar el objeto $wpdb.

    • admin admin dice:

      Hola, gracias por tu comentario.
      Seguramente se podría haber solucionado de una manera más «elegante» y siguiendo los estándares de desarrollo de Worpdress.

      Nosotros optamos por hacerlo de así porque necesitabamos una solución bien rápida, no queríamos armar un plugin ni esperábamos hacer una solución transpolable a otros casos.

      Si te fijás bien, el script tiene dos partes. En la primera trabaja totalmente por fuera de WP, algo lógico porque la la base de datos de origen es una DB MySQL antigua que no maneja la lógica de WP (no tiene nada que ver con WP), y luego de armar un array con los datos, empieza la 2nda parte: se levanta el entorno de WP, y la importación se hace usando la función wp_insert_post() de WP.

      De hecho, funcionó muy bien la migración de esta manera, pudimos ajustar rápidamente muchas cosas y en unas horas teníamos todo el contenido migrado y publicado correctamente en WP. Y nuestro cliente muy contento, que es para nosotros lo mas importante.

      Saludos!

Leave a Reply

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