Artículos

Integra WhatsApp con Dolibarr y acelera tus ventas: descubre WhatsAppIntegration

En la actualidad, WhatsApp se ha convertido en el principal canal de comunicación entre empresas y clientes. Cada día se envían millones de mensajes para solicitar presupuestos, confirmar pedidos, resolver incidencias o realizar el seguimiento de compras. Sin embargo, muchas empresas continúan gestionando estas conversaciones de forma manual, copiando documentos, buscando números de teléfono o descargando facturas para volver a enviarlas.

Este proceso no solo consume tiempo, sino que aumenta el riesgo de errores y dificulta el seguimiento de las comunicaciones.

En ExtreHost creemos que un ERP moderno debe facilitar el trabajo diario, no complicarlo. Por ello hemos desarrollado WhatsAppIntegration para Dolibarr, un módulo profesional que integra WhatsApp directamente en el flujo de trabajo del ERP, permitiendo enviar presupuestos y facturas sin abandonar Dolibarr.

¿Qué es WhatsAppIntegration?

WhatsAppIntegration es un módulo diseñado específicamente para Dolibarr ERP/CRM que permite enviar documentación comercial directamente desde la ficha del cliente o mediante acciones masivas desde los listados.

El objetivo es sencillo: reducir el tiempo necesario para comunicarse con los clientes y mejorar la trazabilidad de todas las comunicaciones comerciales.

El usuario ya no necesita descargar un PDF, abrir WhatsApp, buscar el contacto y adjuntar manualmente el documento. Todo el proceso puede realizarse desde el propio ERP.

Principales funcionalidades

El módulo incorpora una serie de funciones pensadas para adaptarse tanto a pequeñas empresas como a organizaciones con un elevado volumen de documentos.

Entre sus características destacan:

  • Envío de presupuestos directamente desde Dolibarr.
  • Envío de facturas en segundos.
  • Compatibilidad con WhatsApp Web y con proveedores API.
  • Acciones masivas para enviar múltiples documentos de una sola vez.
  • Registro automático de las comunicaciones en la agenda de Dolibarr.
  • Trazabilidad completa de los envíos.
  • Personalización de mensajes mediante plantillas.
  • Integración transparente con el flujo habitual de trabajo del ERP.

Menos tiempo en tareas repetitivas

Uno de los mayores beneficios de esta integración es la automatización.

En muchas empresas, el envío de un presupuesto implica varios pasos:

  1. Generar el PDF.
  2. Descargarlo al ordenador.
  3. Abrir WhatsApp.
  4. Buscar el cliente.
  5. Adjuntar el documento.
  6. Escribir un mensaje.
  7. Enviarlo.
  8. Registrar que se ha realizado el envío.

Con WhatsAppIntegration, este proceso se simplifica enormemente y puede completarse desde la propia interfaz de Dolibarr.

Cuando una empresa envía decenas o incluso cientos de documentos cada semana, el ahorro de tiempo es considerable.

Comunicación más profesional

El módulo también ayuda a mantener una imagen más profesional.

Los mensajes pueden personalizarse utilizando plantillas, incorporando automáticamente datos del cliente, referencias del documento o enlaces al PDF correspondiente.

De esta forma todas las comunicaciones mantienen un formato homogéneo y se reduce el riesgo de errores derivados de la edición manual de cada mensaje.

Acciones masivas para ahorrar tiempo

Una de las funciones más apreciadas por nuestros clientes es el envío masivo.

Desde los listados de presupuestos o facturas es posible seleccionar múltiples documentos y enviarlos consecutivamente sin necesidad de abrir cada uno de ellos.

Esta característica resulta especialmente útil para empresas que trabajan diariamente con un elevado volumen de clientes o realizan campañas periódicas de comunicación.

Compatible con distintos modos de envío

Cada empresa tiene necesidades diferentes.

Por ello WhatsAppIntegration ofrece compatibilidad tanto con WhatsApp Web como con distintos proveedores de API, permitiendo elegir la solución que mejor se adapte al volumen de envíos, al presupuesto disponible o a los requisitos técnicos de cada organización.

Integración completa con Dolibarr

 

A diferencia de soluciones externas que obligan a cambiar constantemente entre aplicaciones, WhatsAppIntegration se integra directamente en Dolibarr respetando la filosofía modular del ERP.

Esto permite mantener toda la información centralizada y facilita el seguimiento histórico de las comunicaciones realizadas con cada cliente.

¿Para quién está pensado?

El módulo resulta especialmente útil para:

  • Empresas de instalación y mantenimiento.
  • Asesorías y despachos profesionales.
  • Distribuidores y mayoristas.
  • Empresas de servicios.
  • Comercios B2B.
  • Autónomos que trabajan habitualmente con presupuestos y facturas.

Cualquier organización que utilice Dolibarr y mantenga una comunicación frecuente con sus clientes mediante WhatsApp puede beneficiarse de esta integración.

Desarrollado por ExtreHost

En ExtreHost no solo ofrecemos servicios de alojamiento y administración de servidores. También desarrollamos módulos profesionales para Dolibarr, integraciones a medida y soluciones orientadas a mejorar la productividad de las empresas.

WhatsAppIntegration es el resultado de esa experiencia, con un desarrollo centrado en la facilidad de uso, la estabilidad y la integración con los procesos habituales de trabajo.

Nuestro objetivo es sencillo: que puedas dedicar menos tiempo a tareas repetitivas y más tiempo a atender a tus clientes.

Si utilizas Dolibarr y quieres integrar WhatsApp en tu flujo de trabajo diario, WhatsAppIntegration puede convertirse en una de las herramientas más útiles para aumentar la productividad de tu empresa.

Más información sobre el módulo y sus características está disponible en DoliStore.

🏡 En Plasencia, Apartamentos Bambú: comodidad, tranquilidad y una ubicación perfecta para disfrutar de la estancia

Cuando buscamos alojamiento para unos días de descanso o una escapada, normalmente queremos algo más que un simple lugar donde dormir. Queremos un espacio donde sentirnos cómodos, donde todo esté cuidado y donde la estancia resulte agradable desde el primer momento. Precisamente esa es la sensación que transmiten los Apartamentos Bambú, un alojamiento que combina comodidad, buena ubicación y una relación calidad-precio realmente atractiva.

Desde que uno llega, se percibe que se trata de un lugar pensado para el descanso. Los apartamentos están diseñados para ofrecer una experiencia acogedora, con espacios bien organizados y un ambiente tranquilo que invita a desconectar del ritmo cotidiano. No es el típico alojamiento impersonal: aquí se nota que se ha puesto atención en los detalles para que el huésped se sienta cómodo durante toda la estancia.

Uno de los aspectos que más destacan quienes se alojan en Apartamentos Bambú es su excelente ubicación. Esto permite disfrutar de la zona con facilidad, moverse con comodidad y tener a mano servicios, lugares de interés y espacios donde pasear o relajarse. La localización es ideal tanto para quienes quieren explorar el entorno como para quienes simplemente buscan tranquilidad y descanso.

Guía de Migración Quirúrgica: Cómo Rescatar o Actualizar tu PrestaShop con Éxito

Cuando una actualización automática de PrestaShop falla o una instalación empieza a dar errores inexplicables (como el bucle de redirecciones 302 o errores de Symfony), la solución más robusta no es reparar, sino trasplantar.

Esta técnica, conocida como migración quirúrgica, consiste en instalar un PrestaShop limpio y mover únicamente el "corazón" de tu negocio (productos, categorías y clientes). Es el método definitivo tanto para reparar instalaciones dañadas como para realizar una actualización mayor sin arrastrar errores del pasado.


1. Preparación del Entorno

Antes de tocar la base de datos, prepara el nuevo destino:

  1. Instalación Limpia: Instala la versión de PrestaShop deseada en una carpeta o base de datos nueva.

  2. Verificación: Asegúrate de que el panel de administración (Backoffice) funciona perfectamente.

  3. Copia de archivos: Mueve las carpetas de imágenes y archivos de usuario desde la instalación antigua a la nueva:

En el caso de que sea una actualización NUEVA..

    • /img/ (Fotos de productos y categorías).

    • /download/ y /upload/.

 

En el caso de que sea una ACTUALIZACIÓN ENTRE IGUALES VERSIONES.

 

  • /img/: Contiene todas las fotos de productos, categorías, fabricantes y logos. Es vital.

  • /download/: Si vendes productos virtuales.

  • /upload/: Archivos que los clientes hayan subido.

  • /themes/tu-tema-actual/: La carpeta de tu plantilla.

  • /modules/: Aquí hay un matiz. Copia solo los módulos que hayas comprado o personalizado. No copies los módulos nativos (ps_...), deja que la instalación limpia de la 8.2 instale sus versiones actualizadas.

  • /mails/: Si personalizaste los correos de envío, pedidos, etc.

 


2. El Script de Extracción (Exportación)

Para evitar el "ruido" de configuraciones corruptas, utilizaremos mysqldump desde la terminal (SSH). Este comando extraerá solo las tablas vitales del catálogo, atributos, clientes y pedidos.

Ejecuta este comando en el servidor de la instalación antigua:

 (Servidor de Origen) 

mysqldump -u usuario -p base_de_datos \
ps_product ps_product_lang ps_product_shop ps_product_attribute \ 
ps_product_attribute_combination ps_product_attribute_lang ps_product_attribute_shop \
ps_category ps_category_lang ps_category_shop ps_category_product \
ps_attribute ps_attribute_group ps_attribute_group_lang ps_attribute_lang \
ps_feature ps_feature_lang ps_feature_product ps_feature_value ps_feature_value_lang \
ps_stock_available ps_manufacturer ps_manufacturer_lang ps_manufacturer_shop \
ps_image ps_image_lang ps_image_shop \
ps_customer ps_customer_group ps_address ps_group ps_group_lang \
ps_orders ps_order_detail ps_order_history \
ps_image_type ps_meta ps_shop ps_shop_url ps_shop_group ps_lang ps_lang_shop \
ps_currency ps_country ps_country_lang \
ps_cms ps_cms_lang ps_cms_shop \
ps_linksmenutop ps_linksmenutop_lang \
ps_homeslider ps_homeslider_slides ps_homeslider_slides_lang \
ps_configuration \
> migracion_esencial.sql
sed -i 's/viejo-dominio.com/nuevo-dominio.com/g' migracion_esencial.sql
 

Nota: Sustituye usuario y base_de_datos por tus credenciales reales. El archivo resultante migracion_esencial.sql contendrá toda la inteligencia de tu negocio.


3. El Script de Restauración (Importación)

Antes de importar, debemos preparar la base de datos de destino. La nueva instalación ya tiene tablas con datos de ejemplo; si importamos encima, los IDs chocarán.

Paso A: Limpiar tablas de destino

Crea un archivo llamado limpiar_destino.sql con el siguiente contenido y ejecútalo en la base de datos nueva:

 (Servidor de destino) 

-- Desactivar revisión de llaves foráneas para poder vaciar tablas
SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE TABLE ps_product; TRUNCATE TABLE ps_product_lang; TRUNCATE TABLE ps_product_shop;
TRUNCATE TABLE ps_product_attribute; TRUNCATE TABLE ps_product_attribute_combination;
TRUNCATE TABLE ps_product_attribute_lang; TRUNCATE TABLE ps_product_attribute_shop;
TRUNCATE TABLE ps_category; TRUNCATE TABLE ps_category_lang; TRUNCATE TABLE ps_category_shop;
TRUNCATE TABLE ps_category_product; TRUNCATE TABLE ps_attribute; TRUNCATE TABLE ps_attribute_group;
TRUNCATE TABLE ps_attribute_group_lang; TRUNCATE TABLE ps_attribute_lang;
TRUNCATE TABLE ps_feature; TRUNCATE TABLE ps_feature_lang; TRUNCATE TABLE ps_feature_product;
TRUNCATE TABLE ps_feature_value; TRUNCATE TABLE ps_feature_value_lang;
TRUNCATE TABLE ps_customer; TRUNCATE TABLE ps_address; TRUNCATE TABLE ps_orders;
TRUNCATE TABLE ps_order_detail;

SET FOREIGN_KEY_CHECKS = 1;

Paso B: Importar los datos

 (Servidor de destino) 

Ahora, inyecta el archivo que exportamos anteriormente en la base de datos nueva:

# Importar los datos esenciales a la nueva tienda
mysql -u usuario -p base_de_datos_nueva < migracion_esencial.sql

4. El "Ancla" de Seguridad: La Cookie Key

Para que las contraseñas de los clientes importados sigan funcionando, debes sincronizar la clave de cifrado.

  1. Busca en tu instalación antigua el archivo app/config/parameters.php.

  2. Localiza el valor de 'cookie_key'.

  3. Pégalo en el archivo app/config/parameters.php de la nueva instalación.


5. Pasos Post-Migración

Una vez completado el trasplante, realiza estas tres acciones en el nuevo panel de administración:

  1. Regenerar .htaccess: Ve a Parámetros de la Tienda > Tráfico & SEO y pulsa "Guardar".

  2. Limpiar Caché: En Parámetros Avanzados > Rendimiento, limpia la caché de Symfony.

  3. Indexar Productos: En Parámetros de la Tienda > Buscar, reconstruye el índice para que el buscador de la web encuentre los productos recién importados.


5. El Proceso de Integración (Post-Trasplante)

Una vez que hayas volcado tus carpetas antiguas (/img, /modules, /themes, /mails) sobre la instalación limpia, el sistema está en un estado "híbrido". Sigue este orden exacto para consolidar la migración:

  1. Sincronizar Identidad: Copia el cookie_key del archivo app/config/parameters.php antiguo al nuevo. Sin esto, las contraseñas importadas no funcionarán.

  2. Limpieza e Importación SQL: Ejecuta el script de TRUNCATE y luego importa tu migracion_esencial.sql.

  3. Regenerar el motor de rutas: Ve a Parámetros de la tienda > Tráfico & SEO, desactiva las "URLs amigables", guarda, y vuelve a activarlas. Esto reconstruye el archivo .htaccess.

  4. Reconstruir el índice de búsqueda: Ve a Parámetros de la tienda > Buscar y pulsa en "Añadir los productos que faltan al índice".


6. Script de Comprobación Final (Salud del Sistema)

Para asegurarte de que la migración ha sido exitosa y no quedan "cabos sueltos", hemos preparado este script de verificación. Puedes ejecutar estas consultas SQL para detectar posibles errores de integridad:

-- 1. Verificar si hay productos sin categorías (Productos huérfanos)
SELECT COUNT(*) FROM ps_product p 
LEFT JOIN ps_category_product cp ON (p.id_product = cp.id_product) 
WHERE cp.id_category IS NULL;

-- 2. Verificar si hay imágenes que no tienen asignado un producto físico
SELECT COUNT(*) FROM ps_image i 
LEFT JOIN ps_product p ON (i.id_product = p.id_product) 
WHERE p.id_product IS NULL;

-- 3. Comprobar que los clientes tienen su dirección asociada
SELECT c.email, a.alias FROM ps_customer c 
LEFT JOIN ps_address a ON (c.id_customer = a.id_customer) 
WHERE a.id_address IS NULL;

Verificación de Permisos (Terminal SSH)

Finalmente, ejecuta este comando para asegurar que PrestaShop tiene permisos de escritura en las carpetas que acabas de mover:

# Comprobar permisos de escritura en carpetas críticas
find img/ modules/ themes/ mails/ -type d -not -perm 755
find img/ modules/ themes/ mails/ -type f -not -perm 644

Consejo final de ExtreHost: Si tras la migración ves una pantalla en blanco, activa el Modo Depuración en config/defines.inc.php cambiando PS_MODE_DEV a true. Esto te dirá exactamente qué módulo está causando el conflicto en la nueva versión.


Resumen para el Administrador

  • Archivos movidos: OK.

  • Base de Datos inyectada: OK.

  • Cookie Key sincronizada: OK.

  • URLs e Índices regenerados: OK.

¡Tu tienda ahora es una instalación limpia, rápida y libre de errores heredados!


Este método es el más limpio y seguro para dejar atrás errores críticos de sistema. Al tratar los datos como piezas modulares, garantizas que la nueva instalación nazca sana y optimizada.

 


Situación inicial - Tras el primer paso.

La tienda original funcionaba correctamente. La tienda clonada también arrancaba, cargaba productos, tema, páginas y estructura general. Sin embargo, al abrir el menú “Productos”, la navegación no coincidía con la original.

A simple vista parecía un problema de categorías no clonadas, pero al revisar la base de datos se comprobó que las categorías sí existían. Es decir: el problema no era la ausencia de datos, sino la forma en la que PrestaShop los estaba utilizando en la tienda clonada.

Ese tipo de incidencia es muy habitual en migraciones reales. La información está en base de datos, pero faltan asociaciones internas o configuraciones complementarias que permiten que el front-end la represente correctamente.


Paso 1. Confirmar si las categorías existen realmente en destino

Lo primero fue comprobar si las categorías del menú estaban presentes en la base de datos de la tienda clonada.

Consulta usada:

SELECT c.id_category, cl.name, cs.id_shop
FROM ps_category c
JOIN ps_category_lang cl ON c.id_category = cl.id_category
LEFT JOIN ps_category_shop cs ON c.id_category = cs.id_category
WHERE cl.id_lang = 1
ORDER BY c.id_category;

Con esta verificación se confirmó que categorías como:

  • Productos
  • Productos Sanitarios
  • Cuidado Capilar
  • Complemento Alimenticio
  • Bebés Y Mamás
  • Accesorios del Bebé
  • Alimentación del Bebé

y muchas otras, ya existían en la base de datos destino.

Conclusión de este paso: las categorías estaban clonadas. El problema no era su ausencia.


Paso 2. Comprobar si el menú estaba siendo gestionado por el módulo correcto

Cuando una categoría existe pero no aparece correctamente en el menú, el siguiente paso es revisar el sistema que genera esa navegación.

En este caso se revisó si el módulo responsable era ps_mainmenu o algún sistema de menú propio del tema.

Primero se buscó la configuración del menú en ps_configuration, pero la consulta inicial no devolvió resultados:

SELECT *
FROM ps_configuration
WHERE name LIKE '%MAINMENU%';

Esto no significaba necesariamente que el menú no existiera, sino que el módulo podía guardar la configuración con otro nombre.

Después se comprobó directamente qué módulos de menú estaban instalados y en qué hook estaban cargados.

Consulta útil:

SELECT id_module, name, active
FROM ps_module
WHERE name LIKE '%menu%'
   OR name LIKE '%mega%'
   OR name LIKE '%nav%'
   OR name LIKE '%top%'
ORDER BY name;

En la tienda origen apareció ps_mainmenu, y además se confirmó que estaba asociado al hook correcto:

SELECT m.name AS modulo, h.name AS hook, hm.position
FROM ps_hook_module hm
JOIN ps_module m ON hm.id_module = m.id_module
JOIN ps_hook h ON hm.id_hook = h.id_hook
WHERE h.name IN ('displayTop', 'displayNav1', 'displayNav2', 'displayHeader', 'displayHome')
ORDER BY h.name, hm.position;

Resultado relevante:

  • ps_mainmenu en displayTop

En la tienda destino también existía ps_mainmenu, estaba activo y correctamente enganchado a displayTop.

Conclusión de este paso: el módulo del menú sí estaba presente y cargado correctamente.


Paso 3. Confirmar que el menú estaba apuntando a la categoría correcta

El siguiente paso fue revisar la configuración real del módulo. En PrestaShop, ps_mainmenu no siempre guarda sus valores con el nombre “MAINMENU”, sino frecuentemente con claves relacionadas con BLOCKTOPMENU.

Consulta usada:

SELECT id_configuration, id_shop_group, id_shop, name, value
FROM ps_configuration
WHERE name LIKE '%BLOCKTOPMENU%'
ORDER BY name, id_shop_group, id_shop;

Resultado clave:

MOD_BLOCKTOPMENU_ITEMS = CMS_CAT1,CAT2,LNK1,LNK2,LNK3

Esto significaba que el menú sí estaba configurado para incluir:

  • una categoría CMS,
  • la categoría CAT2 (Productos),
  • varios enlaces personalizados.

Por tanto, el problema no estaba en que ps_mainmenu apuntara a una categoría equivocada. El menú estaba bien configurado para cargar Productos.

Conclusión de este paso: el módulo sí sabía qué categoría debía mostrar.


Paso 4. Verificar la jerarquía real del árbol de categorías

Cuando el módulo, la categoría principal y la configuración son correctos, el siguiente punto a revisar es el árbol real de categorías: padres, hijos, niveles y profundidad.

Consulta usada:

SELECT c.id_category, c.id_parent, c.level_depth, c.nleft, c.nright, c.active, cl.name
FROM ps_category c
LEFT JOIN ps_category_lang cl 
  ON c.id_category = cl.id_category AND cl.id_lang = 1
ORDER BY c.id_category;

Después, para centrarse solo en las descendientes de Productos, se utilizó una consulta más precisa:

SELECT c.id_category, c.id_parent, c.level_depth, cl.name
FROM ps_category c
JOIN ps_category_lang cl 
  ON c.id_category = cl.id_category AND cl.id_lang = 1
WHERE c.nleft > (
    SELECT nleft FROM ps_category WHERE id_category = 2
)
AND c.nright < (
    SELECT nright FROM ps_category WHERE id_category = 2
)
ORDER BY c.nleft;

Esto permitió confirmar que la jerarquía existía y era coherente. Por ejemplo:

  • Productos Sanitarios colgaba de Productos
  • Bebés Y Mamás colgaba de Productos
  • Accesorios del Bebé colgaba de Bebés Y Mamás
  • Alimentación del Bebé colgaba de Bebés Y Mamás
  • Biberones, Tetinas y Vajillas colgaban de Accesorios Alimentación

Conclusión de este paso: el árbol de categorías estaba bien definido.


Paso 5. Revisar la categoría raíz y la categoría de inicio

En una clonación de PrestaShop es fundamental comprobar que la tienda mantiene correctamente sus referencias internas a la categoría raíz y a la categoría de inicio.

Consulta usada:

SELECT name, value
FROM ps_configuration
WHERE name IN (
  'PS_ROOT_CATEGORY',
  'PS_HOME_CATEGORY',
  'PS_SHOP_DEFAULT'
);

Resultado:

  • PS_HOME_CATEGORY = 2
  • PS_ROOT_CATEGORY = 1
  • PS_SHOP_DEFAULT = 1

Estos valores eran coherentes con la estructura existente. Por tanto, el problema tampoco estaba ahí.

Conclusión de este paso: la raíz de catálogo era correcta.


Paso 6. Localizar el fallo real: asociaciones faltantes en ps_category_group

Una vez descartados los problemas de menú, de árbol, de jerarquía y de configuración base, quedaba revisar una parte que a menudo se pasa por alto: la asociación de categorías con grupos de clientes.

En PrestaShop, una categoría puede existir, tener padre correcto y estar incluida en el menú, pero si no está asociada a los grupos adecuados, el front-end puede no mostrarla correctamente.

Consulta usada sobre las subcategorías:

SELECT cg.id_category, cg.id_group, cl.name
FROM ps_category_group cg
JOIN ps_category_lang cl
  ON cg.id_category = cl.id_category AND cl.id_lang = 1
WHERE cg.id_category IN (10,11,12,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33)
ORDER BY cg.id_category, cg.id_group;

En destino, esta consulta no devolvió nada.

Eso fue el punto decisivo.

La categoría principal Productos sí tenía grupos asignados, pero todas sus hijas y descendientes carecían de asociaciones en ps_category_group. En consecuencia, el menú principal podía mostrar la categoría padre, pero no construir correctamente toda la navegación secundaria y profunda.

Conclusión de este paso: el fallo real no era el menú, sino la falta de asociaciones de las subcategorías con los grupos de clientes.


Paso 7. Aplicar la corrección mínima y segura

En una migración quirúrgica no se cambia todo. Se corrige únicamente lo que falta.

Como la categoría 2 = Productos ya tenía los grupos correctos, lo más limpio era hacer que todas sus descendientes heredaran esos mismos grupos.

Consulta aplicada en destino:

INSERT IGNORE INTO ps_category_group (id_category, id_group)
SELECT hijos.id_category, grupos.id_group
FROM ps_category AS hijos
JOIN ps_category AS padre ON padre.id_category = 2
JOIN ps_category_group AS grupos ON grupos.id_category = 2
WHERE hijos.nleft > padre.nleft
  AND hijos.nright < padre.nright;

Esta consulta hace exactamente lo necesario:

  • localiza todas las categorías descendientes de Productos,
  • toma los grupos ya asignados a la categoría padre,
  • y los replica solo donde faltan.

Sin sobreescribir nada. Sin tocar categorías ajenas. Sin romper lo que ya funciona.

Ese es el espíritu correcto de una migración quirúrgica.


Paso 8. Validar el resultado

Tras aplicar la corrección, se volvió a comprobar la relación entre categorías y grupos.

Consulta de validación:

SELECT c.id_category, c.id_parent, cl.name,
       GROUP_CONCAT(cg.id_group ORDER BY cg.id_group SEPARATOR ',') AS grupos
FROM ps_category c
JOIN ps_category_lang cl 
  ON c.id_category = cl.id_category AND cl.id_lang = 1
LEFT JOIN ps_category_group cg 
  ON c.id_category = cg.id_category
JOIN ps_category p ON p.id_category = 2
WHERE c.nleft > p.nleft
  AND c.nright < p.nright
GROUP BY c.id_category, c.id_parent, cl.name
ORDER BY c.nleft;

Después de la corrección, todas las categorías descendientes de Productos pasaron a quedar correctamente asociadas a los grupos requeridos, y el menú recuperó su comportamiento esperado.

En ese momento, tanto la tienda original como la clonada mostraban ya la misma estructura funcional en el menú de categorías.


Paso 9. Limpiar caché y comprobar el front-end

Como en cualquier intervención de PrestaShop, una vez ajustadas asociaciones o configuraciones internas, es imprescindible vaciar caché.

Dependiendo del entorno, esto puede hacerse desde el panel o directamente sobre el sistema de archivos.

En entornos gestionados por consola, suele ser recomendable limpiar:

rm -rf var/cache/prod/*
rm -rf var/cache/dev/*

Después de ello, se verificó el resultado directamente en el front-end comparando ambas tiendas.

El menú Productos de la tienda clonada volvió a mostrar correctamente toda la estructura de categorías y subcategorías, ya no solo las primeras visibles, sino también niveles más profundos como:

  • Bebés Y Mamás
  • Accesorios del Bebé
  • Accesorios Baño
  • Esponjas
  • Termómetro
  • Chupetes
  • Cadenitas
  • Látex
  • Silicona
  • Juguetes
  • Alimentación del Bebé
  • Biberones
  • Tetinas
  • Vajillas
  • 0-6 Meses
  • 6-12 Meses
  • 12-18 Meses
  • Carne

Resultado final: el menú quedó alineado con la tienda origen.


Qué enseña este caso real

Este caso demuestra una lección importante: en PrestaShop, clonar bien no significa únicamente copiar datos visibles.

Una migración profesional exige revisar también:

  • configuración de módulos,
  • hooks activos,
  • categorías raíz,
  • relaciones jerárquicas,
  • asociaciones a tienda,
  • asociaciones a grupos,
  • caché y comportamiento final en front-end.

Muchas incidencias no se deben a que falten productos o categorías, sino a que faltan relaciones internas que hacen posible que la tienda interprete esos datos correctamente.

En este caso, el catálogo existía. El menú también. La estructura jerárquica también. Lo que faltaba era una pieza menos visible, pero decisiva: la tabla ps_category_group.


Conclusión

La diferencia entre una clonación superficial y una migración quirúrgica está precisamente ahí.

Una clonación superficial deja una tienda que “parece funcionar”.
Una migración quirúrgica deja una tienda que funciona de verdad.

El proceso correcto no consiste en tocar módulos al azar ni en rehacer el menú desde cero sin entender qué pasa. Consiste en:

  1. comprobar si los datos existen,
  2. identificar qué elemento los consume,
  3. verificar si las relaciones internas son correctas,
  4. corregir solo lo que falta,
  5. validar el resultado final comparando origen y destino.

Cuando se trabaja así, incluso incidencias aparentemente complejas, como la pérdida parcial del menú de categorías tras un clonado, pueden resolverse de forma precisa, segura y sin romper nada de lo que ya estaba bien.


Si tu tienda PrestaShop ha sido clonada, migrada o actualizada y detectas fallos como menús incompletos, categorías invisibles, módulos que no cargan igual o comportamientos distintos entre origen y destino, no siempre hace falta rehacer toda la instalación. Ponte en contacto con nosotros.

En muchos casos, una revisión técnica precisa permite localizar el punto exacto del fallo y reconstruir únicamente lo necesario.

Ese es el objetivo de una migración quirúrgica: rescatar la tienda, conservar lo valioso y devolverle un funcionamiento estable, limpio y coherente.


¿Te ha servido esta guía? En ExtreHost recomendamos siempre realizar una copia de seguridad completa antes de ejecutar scripts SQL. ¡Suerte con tu migración!

Firefox Nightly se vuelve serio en entornos RPM: Mozilla apuesta por los administradores Linux

Durante años, Firefox Nightly ha sido terreno casi exclusivo de desarrolladores inquietos y testers avanzados. Instalaciones manuales, binarios descargados a mano, perfiles separados y actualizaciones poco integradas con el sistema. Todo muy nightly, sí… pero poco práctico en entornos profesionales.

Eso acaba de cambiar.

Mozilla ha dado un paso clave: repositorio RPM oficial para Firefox Nightly, pensado específicamente para distribuciones basadas en RPM como Fedora, RHEL, CentOS Stream u openSUSE. Y esto no es un simple detalle técnico: es una señal clara de hacia dónde quiere moverse Mozilla en Linux.


Nightly, pero con mentalidad de producción

Firefox Nightly sigue siendo lo que siempre ha sido:
la versión más avanzada del navegador, donde aterrizan primero las nuevas APIs, los cambios en el motor, las mejoras de rendimiento y las herramientas experimentales.

La diferencia ahora está en cómo se integra:

  • Instalación y actualizaciones nativas vía DNF o Zypper
  • Sin descargas manuales ni scripts externos
  • Integración limpia con el sistema
  • Convivencia sin conflictos con Firefox estable o ESR

En otras palabras: Nightly deja de ser un experimento aislado y empieza a comportarse como un paquete de sistema serio.

Para quienes administramos servidores, escritorios corporativos o entornos de desarrollo, esto importa (y mucho).

ExtreHost os desea una Feliz Navidad.

Con nuestro más sincero deseo, a clientes y amigos.

¿Necesitas una nueva web profesional en WordPress? En ExtreHost lo hacemos realidad

En ExtreHost ayudamos a empresas y organizaciones a renovar su presencia digital con páginas web modernas, accesibles y totalmente funcionales. Si estás pensando en lanzar una nueva web para tu negocio o modernizar la que ya tienes, esta propuesta es para ti.

🔗 Contácta con nosotros.

✔️ ¿Qué incluye nuestra propuesta?

En cada proyecto, nos comprometemos a ofrecerte un servicio completo y personalizado que te permita centrarte en tu negocio mientras nosotros nos encargamos de lo demás. Esto es lo que puedes esperar al trabajar con nosotros:

  • Diseño atractivo y moderno, adaptado a tu imagen de marca y fácil de usar para tus visitantes.

  • Maquetación profesional de todas las páginas necesarias para tu sitio, con especial cuidado en la jerarquía de la información.

  • Optimización para móviles y tablets, garantizando una experiencia fluida en cualquier dispositivo.

  • Accesibilidad real, cumpliendo los estándares necesarios para personas con discapacidad visual (WCAG 2.1 AA o superior).

  • Migración de contenido desde tu web actual o desde otros formatos si es necesario (textos, artículos, imágenes, etc.).

  • Multilingüe, si lo necesitas, gestionamos sitios en varios idiomas respetando URLs y estructura de navegación.

  • Velocidad y rendimiento optimizados, para que tu web cargue rápido y sin fallos.

  • Panel de administración claro y sencillo, para que puedas gestionar tu sitio de forma autónoma si lo deseas.

  • Asesoramiento continuo, desde el primer contacto hasta después de publicada la web.

🔧 Cómo depurar una web que va lenta usando las herramientas del navegador (Firefox, Chrome y Edge)

Aprende a utilizar las herramientas de desarrollo del navegador para localizar problemas en el servidor, imágenes demasiado pesadas, JavaScript bloqueante, errores HTTP, recursos externos y una configuración incorrecta de la caché

Cuando una página web carga lentamente, no conviene empezar a modificar plugins, comprimir archivos o cambiar de servidor sin saber dónde se encuentra realmente el problema.

La lentitud puede proceder del alojamiento web, PHP, la base de datos, una imagen demasiado grande, una consulta externa, un script que bloquea el navegador, una cadena de redirecciones o una mala configuración de la caché.

Firefox, Google Chrome y Microsoft Edge incluyen herramientas de desarrollo capaces de mostrar qué está ocurriendo durante la carga. Con ellas podemos averiguar qué solicita el navegador, cuánto tarda cada recurso y en qué momento aparece el cuello de botella.

Cómo abrir las herramientas de desarrollo

En Firefox, Chrome y Edge podemos abrir las herramientas de desarrollo pulsando:

F12

En Linux y Windows también podemos utilizar:

Ctrl + Mayús + I

En macOS, el atajo habitual es:

Cmd + Opción + I

Otra posibilidad consiste en pulsar con el botón derecho sobre cualquier parte de la página y seleccionar «Inspeccionar».

Aunque los nombres y la colocación de algunas opciones cambian ligeramente entre navegadores, los apartados principales son prácticamente los mismos: Inspector, Consola, Red, Rendimiento, Almacenamiento y Depurador.

Empieza por una prueba limpia

Antes de analizar la página conviene reducir las interferencias. Una extensión del navegador, una VPN, un antivirus, una caché antigua o una sesión iniciada pueden alterar los resultados.

Abre preferiblemente una ventana privada, desactiva temporalmente las extensiones que puedan modificar las páginas y realiza varias mediciones. Una sola prueba no siempre resulta representativa, porque la carga del servidor y la conexión pueden variar.

También debemos comparar la primera visita, sin archivos almacenados, con una segunda carga en la que intervenga la caché.

La pestaña Red muestra todo lo que descarga la página

La herramienta más útil para comenzar es la pestaña «Red» o «Network». Esta sección registra el documento HTML, las hojas de estilo, archivos JavaScript, imágenes, fuentes, peticiones a la API, anuncios y conexiones con servicios externos.

La pestaña estará vacía si la página terminó de cargar antes de abrir las herramientas. Por eso debemos abrir «Red» y recargar posteriormente la web.

Podemos utilizar:

Ctrl + R

Para comprobar cómo se comporta una primera visita, activaremos temporalmente la opción «Desactivar caché» y recargaremos la página. Esta opción solo funciona mientras las herramientas de desarrollo permanecen abiertas.

En Chrome y Edge también podemos mantener pulsado el botón de recarga y seleccionar «Vaciar la caché y volver a cargar de manera forzada».

No debemos confundir esta opción de diagnóstico con una recomendación para la web. La caché debe estar correctamente configurada para los visitantes; únicamente la desactivamos durante la prueba para obligar al navegador a descargar nuevamente todos los recursos.

Cómo interpretar las columnas de la pestaña Red

Cada fila representa una petición realizada por el navegador. Las columnas más importantes son «Nombre», «Estado», «Tipo», «Iniciador», «Tamaño», «Tiempo» y «Cascada».

«Nombre» identifica el archivo o la dirección solicitada. «Estado» muestra el código HTTP recibido. «Tipo» permite distinguir documentos, imágenes, scripts, hojas de estilo, fuentes y peticiones AJAX. «Iniciador» indica qué elemento o script provocó la solicitud. «Tamaño» refleja los datos transferidos y «Tiempo» muestra la duración completa.

La columna «Cascada» o «Waterfall» representa gráficamente cuándo comenzó y terminó cada petición. Una barra que empieza muy tarde puede indicar que otro recurso está bloqueando la carga. Una barra especialmente larga señala una petición que merece ser examinada.

Podemos ordenar los resultados por tiempo o tamaño para encontrar rápidamente los elementos más lentos y pesados.

Qué significan los códigos HTTP

El código 200 indica que el recurso se ha entregado correctamente. Un 301 o 302 representa una redirección. Una redirección aislada puede ser normal, pero varias consecutivas añaden retrasos innecesarios.

Un 304 significa que el navegador ha comprobado el recurso y puede reutilizar la copia almacenada. Los códigos 404 identifican archivos que no existen, mientras que un 403 indica que el servidor ha rechazado el acceso.

El código 429 aparece cuando un servicio considera que se han realizado demasiadas peticiones. Los errores 500, 502, 503 y 504 suelen señalar problemas en el servidor, PHP, el proxy, la aplicación o algún servicio situado por detrás.

Una página puede llegar a mostrarse aunque acumule errores. Por ejemplo, un JavaScript inexistente puede impedir que funcione un formulario sin afectar aparentemente al resto del contenido.

El dato más importante: TTFB

Al pulsar sobre una petición podemos acceder a la pestaña «Tiempos» o «Timing». Allí se descompone la duración en diferentes fases: cola, búsqueda DNS, conexión, negociación TLS, envío de la solicitud, espera de respuesta y descarga.

El valor «Waiting for server response» o «Esperando respuesta del servidor» se asocia al TTFB, siglas de Time to First Byte. Mide cuánto tiempo transcurre hasta que el navegador recibe el primer byte de la respuesta.

Si el documento HTML principal presenta un TTFB elevado, el problema probablemente se encuentra antes de que el navegador pueda empezar a dibujar la página. Las causas pueden estar en PHP, la base de datos, el CMS, una API consultada por el servidor, la falta de caché, la saturación del alojamiento o una configuración inadecuada.

Si el servidor responde rápidamente, pero la descarga tarda demasiado, debemos revisar el tamaño del recurso, la compresión y la conexión.

Un TTFB alto no identifica por sí mismo la causa exacta, pero permite separar un problema del servidor de otro relacionado con el procesamiento dentro del navegador.

Cómo reconocer los problemas más frecuentes

Cuando el HTML principal tarda varios segundos en comenzar a descargarse, debemos investigar el servidor y la aplicación. Si el HTML llega rápido pero una imagen tarda demasiado, probablemente la imagen sea excesivamente grande o no esté optimizada.

Si la página espera a que termine un archivo JavaScript antes de mostrar el contenido, ese script podría estar bloqueando el renderizado. En ese caso debemos estudiar si puede cargarse mediante defer, retrasarse o dividirse.

Si las barras más largas pertenecen a dominios externos, la lentitud puede proceder de servicios publicitarios, analítica, fuentes remotas, mapas, redes sociales, vídeos o sistemas de consentimiento.

Cuando aparecen muchas peticiones pequeñas, el coste puede encontrarse en el establecimiento de conexiones y en la propia cantidad de solicitudes. HTTP/2 y HTTP/3 reducen parte de este problema, pero no convierten en gratuita una página con cientos de recursos innecesarios.

También debemos revisar las redirecciones. Si una petición pasa de HTTP a HTTPS, después al dominio con www y finalmente a otra ruta, el navegador deberá completar varios recorridos antes de recibir el contenido definitivo.

Analizar las imágenes

Las imágenes suelen representar buena parte del peso total de una página. En la pestaña Red podemos filtrar por «Img» o «Imágenes» y ordenar por tamaño.

Una fotografía mostrada a 800 píxeles no debería descargarse con una resolución de 5.000 píxeles. Tampoco tiene sentido utilizar un archivo de varios megabytes para una miniatura.

Conviene servir cada imagen con dimensiones adecuadas, utilizar formatos modernos como WebP o AVIF cuando resulten compatibles y aplicar compresión sin destruir la calidad visual.

Las imágenes situadas fuera de la zona visible inicialmente pueden utilizar carga diferida mediante loading="lazy". Sin embargo, no se recomienda aplicar carga diferida a la imagen principal que aparece nada más abrir la página, porque podría retrasar el elemento visual más importante.

Revisar la caché y la compresión

Al seleccionar un recurso podemos examinar sus cabeceras HTTP. Cache-Control indica durante cuánto tiempo puede conservarlo el navegador. Los archivos estáticos versionados, como imágenes, CSS y JavaScript, suelen beneficiarse de una caché prolongada.

Si todos los recursos vuelven a descargarse en cada visita, la configuración de caché puede ser insuficiente. Si permanecen almacenados después de haber cambiado, puede ser necesario versionar sus nombres o direcciones.

También debemos comprobar la cabecera Content-Encoding. Los documentos HTML, CSS, JavaScript, JSON y SVG deberían enviarse normalmente comprimidos mediante Brotli o Gzip.

Las imágenes JPEG, PNG, WebP y AVIF ya utilizan sus propios métodos de compresión, por lo que comprimirlas nuevamente con Gzip apenas aporta beneficios.

Utilizar la Consola para encontrar errores invisibles

La pestaña «Consola» muestra errores de JavaScript, advertencias de seguridad, recursos bloqueados y mensajes generados por la aplicación.

Un error puede interrumpir la ejecución de los scripts posteriores y dejar menús, botones o formularios sin funcionar. También podemos encontrar bloqueos por políticas CORS, contenido mixto cargado mediante HTTP dentro de una página HTTPS o llamadas a servicios externos que no responden.

No todas las advertencias provocan lentitud, pero una consola llena de errores suele indicar que el sitio necesita una revisión.

Conviene recargar la página con la consola abierta y observar cuáles aparecen durante el proceso inicial.

La pestaña Rendimiento analiza lo que ocurre dentro del navegador

La pestaña Red muestra cuándo se descargan los archivos, pero una web también puede ser lenta después de recibirlos. Un JavaScript pesado puede ocupar el procesador, bloquear el hilo principal y retrasar la respuesta a los clics.

Para comprobarlo abrimos «Rendimiento» o «Performance», iniciamos una grabación, recargamos la página, esperamos a que termine y detenemos el registro.

El navegador mostrará la actividad del procesador, la ejecución de JavaScript, los cálculos de estilos, la composición de la página y las tareas de renderizado.

Las tareas largas suelen señalar funciones JavaScript que mantienen ocupado el hilo principal. Los cambios frecuentes de tamaño o posición pueden indicar problemas de estabilidad visual.

Las versiones actuales de las herramientas de Chrome también permiten observar métricas como LCP, CLS e INP. LCP mide cuándo aparece el contenido principal, CLS detecta desplazamientos inesperados del diseño e INP evalúa la capacidad de respuesta de la página ante las interacciones.

Lighthouse sirve como primera orientación

Chrome y Edge incorporan Lighthouse. Esta herramienta realiza una auditoría automática de rendimiento, accesibilidad, buenas prácticas y SEO.

El informe puede detectar imágenes sin optimizar, JavaScript innecesario, recursos que bloquean el renderizado, políticas de caché poco eficientes y problemas relacionados con las Core Web Vitals.

Lighthouse resulta útil para obtener una visión general, pero su puntuación no debe considerarse una verdad absoluta. Los resultados pueden cambiar según el ordenador, la carga del sistema y la conexión.

Lo importante no es perseguir una puntuación de 100 a cualquier precio, sino corregir los problemas que afectan realmente a los usuarios.

Firefox no integra Lighthouse de la misma forma, pero dispone de excelentes herramientas de Red, Rendimiento, Accesibilidad y Depuración. También podemos ejecutar PageSpeed Insights o Lighthouse desde un navegador basado en Chromium cuando necesitemos esa auditoría concreta.

Simular una conexión móvil lenta

Una web puede funcionar perfectamente con fibra óptica y resultar desesperante desde un teléfono con mala cobertura.

Chrome, Firefox y Edge permiten limitar artificialmente la velocidad de red. Podemos simular una conexión móvil lenta y, en algunos casos, reducir también la potencia de CPU disponible.

Esta prueba permite descubrir páginas que descargan demasiados datos, imágenes enormes y scripts cuya ejecución apenas se nota en un ordenador potente, pero bloquea un móvil modesto.

La simulación no reproduce exactamente todos los dispositivos reales, aunque ofrece una referencia mucho más útil que probar únicamente desde el equipo del desarrollador.

Comprobar los servicios de terceros

Muchas páginas dependen de recursos que no controla directamente su propietario. Google Fonts, vídeos, mapas, sistemas de estadísticas, chat, publicidad, redes sociales y plataformas de consentimiento pueden retrasar la carga.

En la pestaña Red podemos activar la columna «Dominio» y comprobar desde qué servidores se descargan los recursos.

Una forma práctica de confirmar la sospecha consiste en bloquear temporalmente una petición o dominio desde las herramientas del navegador y repetir la prueba. Si la página mejora claramente, habremos identificado un servicio que merece ser

El Nuevo Stack Tecnológico: Cómo la IA, el Low-Code y la Soberanía Están Redefiniendo el Futuro del Software

Europa está construyendo su propio camino hacia una tecnología más responsable y descentralizada, apoyada por talento freelance de alto nivel. Esta evolución no solo permite innovar con velocidad, sino también con criterio y sostenibilidad. Si estás buscando nuevas oportunidades, el momento de actualizarte es ahora.

El ecosistema tecnológico europeo está cambiando más rápido que nunca. Ya no se trata solo de adoptar inteligencia artificial, sino de reorganizar completamente las bases sobre las que se construyen las soluciones tecnológicas. Así lo revela el reciente informe Tech Trends 2025 publicado por Malt, el mayor marketplace freelance de Europa. En este artículo, desglosamos lo que necesitas saber sobre las nuevas tendencias, herramientas, lenguajes, amenazas y oportunidades que están marcando el camino del desarrollo y la arquitectura de software en los próximos años.

6 Razones por las que tu web ha perdido posicionamiento y tráfico en Internet

Si tu web ha perdido posicionamiento en buscadores y has notado una drástica reducción de tráfico, es momento de analizar las posibles causas. A continuación, te explicamos algunos de los motivos más comunes y cómo solucionarlos.

1. Incompatibilidades con scripts heredados

Si tu sitio web utilizó anteriormente un CMS antiguo, como por ejemplo PHPNuke o cualquier otro sistema antiguo, es posible que tengas un script de compatibilidad, debes revisarlo por si este hubiera dejado de funcionar debido a actualizaciones en la versión de PHP. Esto puede generar errores en tu web y afectar el rastreo por parte de los motores de búsqueda.

Solución: Revisa los registros de errores de tu servidor y el funcionamiento del script y asegúrate de que todos los scripts sean compatibles con la versión actual de PHP. Si es necesario, actualiza o reescribe el código.

2. Mapa del sitio desactualizado o roto

El sitemap.xml es esencial para que los motores de búsqueda indexen correctamente tu sitio. Si ha dejado de funcionar debido a una actualización o cambio en tu plataforma, Google y otros buscadores pueden tener problemas para descubrir e indexar tus páginas.

Solución: Verifica si el mapa del sitio es accesible y válido utilizando herramientas como Google Search Console. Si no es válido, genera uno nuevo y actualiza la configuración en tu archivo robots.txt.

Tutorial sobre Cómo Crear Post y Artículos en WordPress

Introducción

WordPress es una de las plataformas más populares para crear y gestionar contenido en la web. Este tutorial te guiará paso a paso en el proceso de crear posts (entradas) y artículos para tu sitio web.

Paso 1: Accede al Escritorio de WordPress

  1. Ingresa a tu sitio web y dirígete al inicio de sesión. Normalmente, puedes hacerlo agregando /wp-admin al final de tu URL. (por ejemplo.: www.misitiowp.com/wp-admin/ )

  2. Inicia sesión con tu usuario y contraseña.

 

Paso 2: Ve a la Sección de Entradas

  1. En el menú lateral izquierdo, selecciona Entradas.

  2. Haz clic en Añadir nueva para crear una nueva entrada.

Información corporativa y medios

Horario Comercial

Lunes: 9am - 7:30pm

Martes: 9am - 7:30pm

Miércoles: 9am - 7:30pm

Jueves: 9am - 7:30pm

Viernes: 9am - 1:30pm

(Viernes tarde, cerrado)


Mañanas, 9am-1:30pm

Tardes, 4pm-7:30pm


Sáb y Dom: Cerrado