Algunos sitios de WordPress llegan a un punto en el que el modelo de contenido ya no se adapta a las necesidades de la organización. Los tipos de contenido personalizados, las entidades personalizadas y los campos personalizados se vuelven necesarios para representar los datos internos con precisión, y Drupal los admite todos, dando forma a esos datos con total flexibilidad.
Otros sitios llegan a ese punto por la IA. Drupal ha construido un sólido ecosistema de IA en los últimos años, permitiendo integraciones de todo tipo necesario: creación de contenido, comprobaciones de accesibilidad, RAG, entre otras. Estas son las dos situaciones que hay detrás de la mayoría de las migraciones de WordPress a Drupal: una arquitectura que el sitio ha superado, o una integración de IA que WordPress no puede soportar de forma nativa.
El reto de migrar contenido de WordPress a Drupal
El reto principal en una migración de WordPress a Drupal es migrar el contenido en sí. Los sitios de WordPress pueden tener miles de piezas de contenido que deben trasladarse al sitio de Drupal.
Un proyecto de migración completo pasa por varias fases: rediseñar el sitio si es necesario, construir la nueva arquitectura y crear un nodo de Drupal por cada post o página de WordPress. La creación del contenido es donde se concentra el trabajo real, ya que cada imagen, cada usuario y cada traducción deben llegar, además de adaptar el contenido a un formato diferente definido por la nueva arquitectura.
Una migración de contenido manual no es viable debido a sus altos costes y riesgos. Realizado a mano, este trabajo es propenso a errores humanos. Un error puntual es fácil de arreglar, pero un error sistemático, repetido en miles de piezas de contenido, puede costar más tiempo de arreglar del que habría llevado automatizar toda la migración.
Para realizar migraciones automáticas, Drupal tiene su propio ecosistema de migración. A través del API de Migrate, es posible diseñar y ejecutar migraciones completas de contenido. Metadrop ha contribuido con un módulo especializado en migraciones de WordPress: WordPress Migrate SQL.
El módulo migra todo el contenido y también permite crear migraciones personalizadas. Su configuración base proporciona una migración lista para usar de todos los posts de WordPress como artículos de Drupal, y también importa usuarios, términos y archivos. Hay un tutorial detallado disponible en la documentación del módulo.
Cómo WordPress Migrate SQL lee e importa los datos de WordPress
El módulo lee todo el contenido directamente de la base de datos de WordPress, por lo que se debe de configurar Drupal para conectarse primero a esa base de datos. Funciona a través de la API de Migrate de Drupal, leyendo cada tabla de WordPress: wp_posts, wp_terms, wp_attachments, wp_users y wp_terms_relationships. Entiende la arquitectura de WordPress para migrar el sitio, y puede leer estas tablas incluso cuando se crearon con un prefijo de tabla de WordPress diferente.
Esta conexión directa a la base de datos es lo que diferencia este enfoque de la exportación XML de WordPress. En lugar de trabajar a partir de un archivo de exportación fijo, el módulo recopila todo el contenido, filtra solo lo necesario e incluso puede obtener datos adicionales proporcionados por plugins, como las traducciones. WordPress Migrate cubre un terreno similar pero realiza una migración completa de contenido basada en el formato de exportación WXR de WordPress.
Manejar todos los casos de uso posibles de WordPress dentro de un solo módulo sería demasiado difícil, por lo que el módulo se centra en permitir migrar todo lo que WordPress proporciona por defecto. Debido a que se conecta directamente a la base de datos, se puede extender para recopilar cualquier contenido específico de un plugin que necesite el sitio.
Esa extensibilidad es lo que divide el módulo en dos formas de migrar: habilitando el submódulo "WordPress Migrate SQL - Basic", o generando un módulo personalizado. La forma básica no requiere código personalizado e importa los posts de WordPress como artículos de Drupal de serie. La forma personalizada genera una plantilla que se puede ampliar para abordar personalizaciones específicas del sitio.
Esas personalizaciones suelen ser necesarias para bases de datos heredadas con años de contenido acumulado: enlaces rotos, marcado personalizado que no encaja en el nuevo sitio, plugins de traducción como el Plugin Multilingüe de WordPress, o shortcodes que necesitan procesamiento. Ambas rutas comparten la misma configuración y la misma ejecución, lanzando la migración de posts mediante --execute-dependencies para que los usuarios, términos y archivos adjuntos se ejecuten primero en el orden correcto.
Habilitación y configuración del módulo
Antes de habilitar el módulo, es necesario configurar que la base de datos de WordPress sea accesible desde el servidor de Drupal con al menos privilegios SELECT.
Además de configurar la base de datos, es necesario instalar el módulo drupal/migrate_tools para ejecutar las migraciones. Es utilizado internamente por el submódulo 'WordPress Migrate SQL - Basic' para realizar la migración a través de la interfaz de usuario, y es el estándar para ejecutar migraciones personalizadas.
El primer paso es instalar y habilitar el módulo base, que será utilizado por ambos métodos de migración. Una vez habilitado, configure la conexión a la base de datos de WordPress en Configuración → Sistema → WordPress Migrate SQL, completando las credenciales de la base de datos y la URL base de los archivos. Esto conecta Drupal a la base de datos de WordPress independientemente de la ruta que se siga. Así es como se ve el formulario de configuración:

Después de configurar las credenciales, se puede decidir si realizar una migración básica o una totalmente personalizada.
Migración básica de serie
Habilitar "WordPress Migrate SQL - Basic" añade una pantalla de importación en Configuración → Sistema → WordPress Migrate SQL → Importar.
La página de importación tendrá este aspecto:

Esta página permite tener una visión rápida de cuánto contenido se va a migrar. Después de pulsar importar, se migrará todo el contenido, mostrando una barra de progreso durante el proceso. Una vez finalizado el proceso, se habrán migrado los usuarios, categorías, imágenes y posts. También hay una operación de reversión disponible que deshace todo en caso de que algo parezca incorrecto.
Módulo personalizado
La ruta personalizada se basa en esa misma configuración y ejecuta drush generate wordpress-migration en su lugar. El comando solicita el nombre del módulo, nombre máquina, tipo de nodo de destino, campo de imagen, formato de texto y los vocabularios/campos de categorías/etiquetas, luego genera cuatro migraciones (usuarios, términos, archivos adjuntos, posts) más archivos de configuración de soporte y un README, listos para editar más a fondo. La ejecución del comando se ve así:

Después de crear el módulo a través del comando drush generate, se generará un módulo personalizado como este:

Contiene:
- Configuración: si no existe aún, añade el campo de categoría y el vocabulario al artículo.
- Migraciones: Esto incluye las cuatro migraciones iniciales para posts, usuarios, términos y archivos adjuntos.
Después de habilitar el módulo, se tendrán las migraciones listas para ejecutar:

En este punto, el módulo personalizado no tiene ninguna diferencia con el módulo básico excepto los diferentes nombres de migración y el hecho de que es necesario ejecutar comandos en el servidor. Su principal ventaja es que ahora es posible modificar el código de migración para:
- Añadir más migraciones a la carpeta de migración si es necesario. Por ejemplo, por defecto solo posts, pero quizás sea necesario migrar también páginas personalizadas. En ese caso, esto se soluciona añadiendo un nuevo archivo de migración, basado en la migración de posts original.
- Modificar las cuatro migraciones base en caso de que sea necesario:
- Extraer y configurar módulos específicos de WordPress.
- Procesar algunos valores provenientes de WordPress. Por ejemplo, contenido proveniente de los cuerpos de las posts:
- HTML malformado.
- HTML con un marcado que no se estiliza correctamente en el módulo. Por ejemplo: vídeos de YouTube que se añaden en iframes pero en Drupal es necesario importarlos añadiendo marcado específico de Drupal para CKeditor.
- URLs rotas.
- Añadir plugins de proceso de Migrate que permiten realizar cualquier procesamiento de campo de origen personalizado para la migración.
Casos de uso exitosos
El módulo se ha utilizado para migrar sitios de WordPress para ONG y otras organizaciones, con estas migraciones reales promediando de 500 a 2000 posts por sitio.
En estos proyectos, el proceso se mantiene consistente: habilitar WordPress Migrate SQL, preparar una migración base personalizada y usarla como punto de partida. Esto evita tener que replantear cómo leer las tablas base de WordPress en cada proyecto, dejando el trabajo centrado en las necesidades comerciales específicas de cada proyecto.
Conclusión
Migrar manualmente un sitio de WordPress a Drupal es lento y propenso a errores a cualquier escala real, por lo que es necesario automatizarlo. WordPress Migrate SQL automatiza esa migración directamente desde la base de datos de WordPress, cubriendo posts, usuarios, términos y archivos.
Los sitios de WordPress simples se pueden migrar utilizando la importación básica. Los sitios con marcado personalizado, traducciones o plugins contribuidos que no se pueden migrar directamente pueden comenzar desde el módulo generado y ajustar las migraciones que necesiten.
Consulte la página del módulo.