Como actualizar PrestaShop 1.6.1 a 1.7.5

PrestaShop es una excelente herramienta para crear tu tienda on-line, pero cuando se trata de hacer actualizaciones de versión puede llegar a convertirse en una verdadera pesadilla. El paso de PrestaShop 1.6 a 1.7 es especialmente problemático por los cambios que se han introducido en la arquitectura de la nueva versión. En este artículo te cuento la estrategia que estoy utilizando para migrar mis tiendas de versiones 1.6.1.x a la última disponible (1.7.5.2) y te aporto algunos scripts que a buen seguro te ayudarán a realizar estos mismos pasos en tu tienda (la información es relevante para cualquier persona en el proceso de actualizar PrestaShop 1.6.1 a 1.7.5).

Qué hay de nuevo en PrestaShop 1.7

La versión 1.7 de PrestaShop trae con sigo cambios estructurales importantes. Quizá el mas relevante sea que a partir de la versión 1.7, PrestaShop está basado en Symfony. Symfony es un framework de desarrollo para PHP (lenguaje en el que está escrito Prestahsop y la mitad de la Web) que se basa en el paradigma de Modelo-Vista-Controlador y que con el tiempo se ha convertido en el framework de referencia para desarrollos en PHP.

El paso a Symfony conlleva una rearquitecturización de todo el core de PrestaShop, por lo que mas que una actualización del código de PrestaShop estamos hablando de un rediseño profundo.

Por si fuera poco, en esta nueva versión mayor de PrestaShop se ha modificado la forma en la que se construyen los temas (lo que da el aspecto externo único a cada tienda, aunque todas estén hechas sobre el mismo producto). PrestaShop 1.7 incluye un nuevo Starter Theme (la base de los temas comerciales) completamente diferente, haciendo completamente incompatibles los temas de la versión 1.6 con los de la versión 1.7.

Estos son los dos cambios técnicos de mayor calado. A pesar de sonar a desastre, la nueva versión funciona mas rápido, es mas segura y el desarrollo de nuevas funciones y temas se simplifica y se acelera.

También hay importantes cambios en el ámbito funcional. Por citar algunos: se simplifica la gestión de productos, que resultará mas fácil especialmente para los usuarios que acaban de llegar a la plataforma; se mejora la interfaz de usuario de administración; se simplifica la gestión de módulos que se clasifican por categoría; …

¿Me puedo quedar en PrestaShop 1.6?

Bueno, la versión 1.7 salió al mercado en Noviembre de 2016, así que tampoco estamos hablando de algo recién salido del horno. De hecho la versión actual es 1.7.5.x, así que tiene un grado de madurez muy cercano a la 1.6.1x.

Por otro lado la versión 1.6 queda fuera de mantenimiento en Junio de 2019 (inicialmente planificado para octubre de 2018, pero extendido debido a la baja penetración de la versión 1.7). Estar fuera de mantenimiento significa que el equipo de PrestaShop no realiza nuevos desarrollos para dicha versión. Aparte del estancamiento que supone, en el caso de que se descubra un fallo de seguridad el equipo de PrestaShop no desarrollará un parche para las versiones que ya están fuera de mantenimiento.

Si tienes una tienda activa y es una de tus líneas de negocio, puedes decidir el cuándo te pasas a la versión 1.7, pero está claro que no puedes excluirte de este proceso de actualización (o tu tienda quedará completamente obsoleta en un breve espacio de tiempo).

Como actualizar Prestashop 1.6.1 a 1.7.5 de forma manual

¿Provee PrestaShop de una herramienta de migración?

Dentro de PrestaShop existe una herramienta llamada 1-Click Upgrade que en términos generales simplifica bastante los cambios de versión, pero que en este caso simplemente NO FUNCIONA.

Existen, no obstante, servicios de terceros que permiten llevar a cabo esta migración. Dos cosas a tener en cuenta antes de usarlos:

  • Tienen un coste que dependerá del tamaño de la tienda.
  • Los servicios automáticos resuelven bien algunos aspectos de la migración pero al haber un cambio de tema es imposible pensar en un proceso de migración automático y transparente. Será necesario que un desarrollador complete el proceso.

La alternativa a la migración es recrear la tienda directamente sobre la versión 1.7 de PrestaShop. Es la mas manual, pero es la opción que nos garantiza el mejor resultado. Además, como vamos a volver a reconstruir la tienda, podemos replantearnos algunas de las decisiones de diseño que tomamos en su día y que no funcionaron tan bien.

Actualizar PrestaShop 1.6.1 a 1.7.5 – La estrategia

En lineas generales el proceso de actualización que estoy llevando a cabo para mis tiendas conlleva los siguientes pasos:

  1. Creamos una web nueva con su espacio de alojamiento y base de datos separados de los actuales (aunque puede ser dentro de nuestro actual proveedor y servicio de alojamiento Web). Si por ejemplo nuestra web en producción se llama www.mitienda.es podemos crear mmm.mitienda.es
  2. Instalamos desde cero PrestaShop 1.7.5.2 en la nueva tienda.
  3. Instalamos una versión de nuestro actual tema adaptada para PrestaShop 1.7 (o quizá un tema completamente nuevo, si estamos aprovechando para además lanzar una nueva imagen).
  4. Descargamos la base de datos de nuestra tienda actual en PS 1.6
  5. Cargamos las tablas en nuestra nueva base de datos para mmm.mitienda.es (usando otro prefijo de tablas).
  6. Aplicamos un script que migrará el modelo de datos de PS1.6 a PS1.7 sobre las tablas que acabamos de cargar.
  7. Aplicamos un segundo script que copiará datos de las tablas importadas desde www.mitienda.es a las de mmm.mitienda.es. Con esto nos estaremos llevando los clientes, los pedidos, las facturas, las categorías, los productos, …
  8. Copiamos las imágenes, documentos y ficheros adjuntos de www.mitienda.es a mmm.mitienda.es
  9. Revisamos toda la configuración de la tienda y las igualamos. Aspectos como impuestos, bonos descuento, transportistas, … se habrán copiado con los scripts, pero otras características de configuración habrá que ajustarlas de forma manual.
  10. Configuramos los medios de pago quitando el modo real.
  11. Hacemos los ajustes al tema de la tienda y traducimos los elementos que sean necesarios, replicando o no el aspecto de la tienda original.
  12. Hacemos una prueba de la funcionalidad de la tienda. Realizamos los ajustes del tema y los módulos que corresponda hasta que demos por satisfactorio el funcionamiento de la nueva tienda.
  13. Ponemos en mantenimiento www.mitienda.es.
  14. Volvemos a copiar los datos de productos, pedidos, facturas, … usando el mismo mecanismo que empleamos en la primera migración de datos, pero esta vez solo copiaremos una selección de tablas de www.mitienda.es para no perder los ajustes manuales que hemos estado haciendo.
  15. Volvemos a copiar las imágenes, documentos y ficheros adjuntos.
  16. Configuramos en mmm.mitienda.es los medios de pago en modo real.
  17. A nivel de alojamiento web hacemos que nuestra actual instalación para mmm.mitienda.es se reconozca como www.mitienda.es (como si hiciésemos un cambio de dominio).
  18. Desde el backoffice de PrestaShop ponemos el modo mantenimiento y configuramos las URLs de la tienda para que sea www.mitienda.es
  19. Hacemos una prueba ya sobre nuestra web en producción que incluya un pedido con un pago real.
  20. Si todo va bien podemos quitar el modo mantenimiento y estaremos de nuevo en vivo.
  21. Si detectamos fallos importantes, bastará con deshacer el paso 17 y volver a poner en servicio la versión de la tienda en PS 1.6. A continuación tendríamos que repetir todo el proceso desde el paso 10 y subsanar los problemas encontrados.
  22. Una vez que la web funcione de forma normal y se comiencen a crear nuevos pedidos reales, podemos desmantelar las tablas que hemos usado para la migración y el alojamiento y la base de datos que anteriormente daba servicio a la tienda en PS 1.6

La mayoría de los pasos descritos anteriormente son pasos habituales en el desarrollo de una tienda bajo Prestashop y no voy a entrar en los detalles, por entender que son conocidos (si no es el caso, te puedo ampliar información a través de los comentarios del post).

Lo realmente novedoso de esta estrategia es la forma de migrar los datos y los ficheros (imágenes, documentos, adjuntos, …) que si que veremos con mayor detalle a continuación.

actualizar Prestashop 1.6.1 a 1.7.5
Esquema 1: Estrategia de migración manual

Migrando los datos

En el Esquema 1 se muestran los pasos fundamentales de este proceso de migración manual. Se corresponden con los pasos del 4º al 8º de la relación anterior.

Lo primero es obtener una descarga de la base de datos de nuestra tienda actual en producción que seguirá el modelo de datos correspondiente a la versión 1.6.1. Nuestro proveedor de hosting nos proveerá con herramientas para hacer esta descarga (en el peor de los casos usa phpMyAdmin para generar un fichero .sql.zip con el volcado de tu base de datos).

Es importante poder cargar en nuestra instalación de PrestaShop 1.7 la base de datos que vamos a descargar. Para ello es necesario que los prefijos de las tablas sean diferentes. En nuestro ejemplo estamos asumiendo estos prefijos:

  • ps_v16_ Prefijo de las tablas que vienen de nuestra tienda en producción (versión 1.6.1.x).
  • ps_v17_ Prefijo de las tablas para la nueva tienda en version 1.7.5.2.

No importa que sean otros valores, siempre y cuando sean diferentes. Esto nos permitirá cargar sin problemas la descarga del paso 4 en la misma base de datos que hemos instalado nuestra tienda (paso 5).

Actualizando el modelo de datos

Antes de poder copiar los datos desde las tablas que acabamos de cargar a las tablas que de verdad está usando PrestaShop, debemos realizar una serie de adaptaciones a las tablas que vienen de la versión 1.6.1.x con el objetivo de que tengan exactamente la misma estructura que sus homónimas de 1.7.5.2.

Para ello puedes utilizar el siguiente script:

Este script contiene los comandos SQL necesarios para equiparar estas estructuras. Los comandos están agrupados por la tabla de PrestaShop a la que afectan. Por ejemplo, para la tabla de productos, los cambios necesarios son:

ALTER TABLE `ps_v16_product` ADD `low_stock_threshold` int(10) DEFAULT NULL AFTER `minimal_quantity`;
ALTER TABLE `ps_v16_product` ADD `low_stock_alert` tinyint(1) NOT NULL DEFAULT '0' AFTER `low_stock_threshold`;
ALTER TABLE `ps_v16_product` ADD `additional_delivery_times` tinyint(1) UNSIGNED NOT NULL DEFAULT '1' AFTER `out_of_stock`;

Lee atentamente las notas del scrip. El script ha sido usado con éxito para igualar la estructura del model de datos desde una versión 1.6.1.17 a una 1.7.5.2. Si tu caso no es exactamente este el script puede requerir de adaptaciones adicionales.

El script solo se ocupa de las tablas del core de PrestaShop. Tu tienda puede contener tablas que pertenecen a módulos concretos que no son parte del core. Por norma general volverás a usar esos mismos módulos tal cual en tu tienda en versión 1.7, por lo que no será necesario realizar cambios a la estructura de la base de datos. Si como parte de la migración instalas versiones mas actuales de módulos de terceros, deberás validar si las tablas de dichos módulos requieren de actualizaciones a nivel del modelo de datos.
La migración te permite replantear algunas decisiones de diseño

Copiando los datos

Ahora que las estructuras están igualadas podemos copiar los datos directamente de una tabla a su homónima. Las instrucciones para copiar los datos de una entidad determinada serían:

TRUNCATE ps_v17_<entidad>; 
INSERT INTO ps_v17_<entidad> select * from ps_v16_<entidad>;

El script completo para copiar todos los datos de PrestaShop lo puedes descargar a través de este botón:

Una vez mas lee detalladamente las notas. El caso particular de tu tienda podría requerir de adaptaciones adicionales. La última nota nos habla de los datos que este script no puede copiar:

  • Revisiones de productos (no es parte del core en 1.7)
  • Listas de deseos (no es parte del core en 1.7)
  • Banners de producto en las páginas de categoría (no es parte del core en 1.7)
  • Subscripciones a newsletter (no es parte del core en 1.7)
  • Listado de tiendas físicas (el modelo de datos cambia ostensiblemente e incluye mas tablas y multiidioma)
  • Asociaciones de cuentas de PayPal a clientes (el módulo de 1.7 asocia métodos, no simplemente correos)
  • Datos específicos de módulos de terceros: correos, paypal, redsys, …
  • Datos de runtime como las conexiones, acceso, guets …

Especialmente en el caso de que tengas módulos de terceros con tablas de datos, puedes migrarlas usando el mismo mecanismo que hemos usado para migrar las del core de PrestaShop. Tan solo es necesario que compares la lista de tablas del script con las de tu base de datos y descubras las tablas extra que tiene tu instalación.

PISTA: Los nombres de las tablas de los módulos de terceros suelen hacer referencia al nombre del módulo. Por ejemplo las tablas del módulo del transportista TIPSA comienzan por ps_v16_tipsa_

Refrescando los datos

Tras la instalación de PrestaShop 1.7.5.2 se hace una mirgración completa de los datos de nuestra tienda, como se ha explicado en el apartado anterior.

A continuación la tienda se debe reconfigurar y se deben hacer pruebas. No podemos mantener nuestra tienda en producción parada mientras hacemos este proceso. Los clientes crearán nuevos pedidos, los marketers actualizarán los productos, … Toda esta información debe llevarse de nuevo a la que será nuestra futura base de datos en producción.

En el paso 14 de la estrategia de migración se indica que hay que volver a copiar los datos desde la base de datos en producción. Este proceso puede ser necesario repetirlo varias veces durante el periodo de desarrollo de la nueva tienda. La ultima vez que lo hagamos será ya con nuestra tienda en modo mantenimiento, para asegurarnos de que la base de datos que estamos migrando no recibe ya mas modificaciones.

El proceso consta de varios pasos:

  1. Lo primero será borrar las tablas intermedias que usamos para hacer la migración anterior, usando el script drop_old_tables.sql
  2. A continuación volveremos a realizar la descarga (paso 4), la carga (paso 5) y la actualización del modelo de datos (paso 6) exactamente de la misma forma que hicimos la primera migración.
  3. Finalmente volveremos a copiar los datos, pero esta vez no copiaremos todas las tablas, si no tan solo un subconjunto de éstas, para asegurarnos que no perdemos los cambios de configuración que estemos haciendo en lo que será nuestra futura tienda. Para este fin usamos el script copy_data_wave2.sql

Puedes descargarte aquí los scripts adicionales para este paso:

El script drop_old_tables.sql es tan solo un ejemplo de lo que necesitas hacer. Seguramente tu tienda tenga un conjunto de tablas diferente del que se presenta aquí. Puedes fácilmente generar el listado completo de tablas de tu base de datos con un comando como este:

mysql -u <db_user> -p<password> <db_name> -B -e "show tables" | grep ps_v16_ > old_table_list.txt

También es necesario que revises el script copy_data_wave2.sql que básicamente es una copia de copy_data.sql con algunas líneas comentadas. Justamente esas líneas comentadas están marcando que tipo de elementos de PrestaShop no se están modificando durante el proceso de migración. Por ejemplo estamos asumiendo que no se están definiendo idiomas nuevos, ni modificando las reglas de impuestos, … Comenta o descomenta entidades en función de lo que se esté haciendo en tu tienda en particular.

Migrando imágenes y documentos

Las imágenes de producto o las que usamos para los fabricantes, categorías, transportistas, … y las que incrustamos en nuestras páginas del CMS, no están almacenadas en la base de datos (solo hay una referencia a ellas).

De la misma forma los archivos adjuntos de los productos, los elementos descargables y en general cualquier documento adicional que usemos, no estará almacenado en la base de datos, si no en el sistema de archivos de nuestra tienda.

La migración no sería completa si no nos llevamos también todos estos archivos a nuestra nueva tienda.

La mejor forma para hacerlo es a través del comando scp (o incluso del cp si ambas tiendas residen en la misma máquina). scp usa el protocolo SSH para transmitir de forma segura los ficheros entre la actual tienda en producción y nuestra futura tienda en PS 1.7. Por supuesto para usar este recurso debemos poder ejecutar una Shell sobre el servidor de nuestra tienda.

Por ejemplo para copiar las imágenes que hayamos incrustado en las páginas del CMS podemos usar estos comandos (en la tienda con PrestaShop 1.7.5.2):

scp -r <usuario_ftp>@ftp.mitienda.es:~/img/cms/* ~/img/cms

Si no tenemos disponible scp, podemos usar una herramienta de FTP para hacer lo mismo a través de una máquina de paso. Ten presente que el tiempo requerido para hacer este paso se puede fácilmente multiplicar por 10 si usas FTP.

Actualizar Prestashop 1.6.1 a 1.7.5 es fácil si sabes cómo
Actualizar Prestashop 1.6.1 a 1.7.5 es fácil si sabes cómo

Los directorios de PrestaShop que tenemos que copiar son los siguientes:

OrigenDestinoElementos
/img/c/img/cCategorías
/img/p/img/pProductos
/img/cms/img/cmsPáginas CMS
/img/descriptions/img/descriptionsDescripciones de producto
/img/m/img/mManufacturers
/img/s/img/sCarriers
/download/downloadArchivos adjuntos

Adicionalmente habrá módulos que también almacenarán sus propias imágenes. En las instalaciones de PrestaShop es muy habitual encontrarse estos:

OrigenDestinoElementos
/modules/blockbanner/img/modules/ps_banner/imgBanners
/modules/homeslider/images//modules/ps_imageslider/imagesSlides

Aunque puede haber varios mas que debes descubrir. Presta especial atención a los módulos que vengan con tu tema.

Finalmente es muy habitual que en tu tienda se haya creado una carpeta para subir elementos diversos que luego se usan en las fichas de productos. Esta carpeta no tiene un nombre estándar pero suele llamarse /images, /imagenes o /uploads. Busca en la carpeta raíz de tu tienda subcarpetas que tengan contenido multimedia y copia también estas carpetas.

Adaptar URLs internas

Por lo general tus páginas de producto, las páginas del CMS o la página de inicio pueden contener URLs a elementos internos de la tienda.

Bajo el escenario de migración que se ha descrito aquí, cuando una URL de este estilo es generada por PrestaShop, ésta hará automáticamente referencia al nuevo servidor mmm.mitienda.es.

Sin embargo las URLs que hayamos escrito nosotros de forma estática (por ejemplo en la descripción detallada de la ficha de un producto) seguirán apuntando a www.mitienda.es

Inicialmente esto no es un problema y las páginas se pintarán bien dado que las URLs que hacen referencia a nuestra tienda en producción se sirven desde dicha instancia de la tienda en producción.

Cuando completemos la migración las mismas URLs se servirán desde la nueva instancia, pero la URL como tal no habrá cambiado.

No obstante bajo ciertas circunstancias nos puede interesar crear silos completamente independientes. En ese caso tendremos que adaptar las URLs internas estáticas para que se sirvan desde el servidor de la futura tienda, que es mmm.mitienda.es en nuestro ejemplo.

Hacer esta adaptación es sencillo. Se hace entre los pasos 4º y 5º editando el fichero de descarga de la base de datos. Se hará una sustitución global de http://www.mitienda.es/ por http://mmm.mitienda.es/ y de https://www.mitienda.es/ por https://mmm.mitienda.es/

En la última migración de datos (paso 14) no será necesario realizar esta adaptación, puesto que cuando levantemos el servidor estará configurado como www.mitienda.es

Conclusión

Si tienes una tienda que se soporta por PrestaShop 1.6 , antes o después tendrás que abordar su migración a la nueva versión de PrestaShop. Postergarlo no va a volver el proceso mas sencillo.

Hay diferentes estrategias para hacer esta migración:

  • A través de un proceso manual como el que se describe en este artículo.
  • A través de servicios de terceros.
  • De forma semiautomática usando herramientas de migración específicas de terceros (la oficial de PrestaShop no funciona).

Ninguna de las opciones va a ser completamente automática y transparente. Debes planificar adecuadamente las actividades y prever los recursos materiales y humanos que te harán falta.

La principal ventaja de abordar un proceso de migración manual es que, como vuelves a crear la tienda desde cero, es posible replantearse algunas de las decisiones de diseño que tomaste en el pasado y que no han funcionado como querías. También es la opción adecuada si además de migrar quieres renovar el aspecto de tu tienda introduciendo una nueva plantilla. La principal desventaja es que necesitarás una persona con los conocimientos técnicos adecuados para llevar a cabo el proceso de migración.

Si has sido capaz de comprender el contenido de este artículo, seguramente tengas el bagaje necesario para llevar a cabo la migración por tus propios medios. Sin embargo si las técnicas y el lenguaje utilizado no te ha resultado familiar, lo mejor es que te pongas en manos de un profesional con experiencia en este tipo de migraciones.

Espero no obstante que la explicación detallada de los pasos para actualizar PrestaShop 1.6.1 a 1.7.5 y los scripts que incluyo te faciliten la migración de tu tienda. Son el resultado de aplicar este proceso en varias de las tiendas que yo gestiono, así que sabemos que funcionan y que son capaces de migrar correctamente los datos de la tienda. Aunque cada tienda en PrestaShop es muy particular y antes de ejecutarlos deberás analizar si se requieren adaptaciones y/o extensiones para tu instalación.

Un profesional cualificado te ayudara a completar la migración con éxito.
Un profesional cualificado te ayudara a completar la migración con éxito.