EmDash ofrece una ruta de migración completa desde WordPress. Importa entradas, páginas, medios y taxonomías desde el panel de administración, sin necesidad de CLI.
Antes de empezar
Exporta tu contenido
En WordPress, ve a Herramientas → Exportar y descarga un archivo de exportación completo (.xml).
Haz copia de seguridad del sitio
Mantén WordPress en marcha hasta verificar que la migración ha tenido éxito.
Métodos de importación
EmDash admite tres métodos para importar contenido de WordPress:
| Método | Ideal para | Incluye borradores | Requiere auth |
|---|---|---|---|
| Subida WXR | Migraciones completas | Sí | No |
| WordPress.com | Sitios alojados en WordPress.com | Sí | OAuth |
| REST API (sondeo) | Revisar contenido antes de exportar | No | Opcional |
La subida de archivo WXR se recomienda en la mayoría de los casos: captura todo el contenido, incluidos borradores, campos personalizados y entradas privadas.
Importación con archivo WXR
-
Exportar desde WordPress
En el admin de WordPress, Herramientas → Exportar → Todo el contenido → Descargar archivo de exportación.
-
Abrir el asistente de importación
En EmDash, Admin → Ajustes → Importar → WordPress.
-
Subir el archivo de exportación
Arrastra y suelta tu
.xmlo haz clic para buscar. El archivo se analiza en el navegador. -
Revisar el contenido detectado
El asistente muestra lo encontrado:
Found in export: ├── Posts: 127 → posts [New collection] ├── Pages: 12 → pages [Add fields] └── Media: 89 attachments -
Configurar asignaciones
Activa qué tipos de entrada importar. EmDash automáticamente:
- Crea colecciones nuevas para tipos sin asignar
- Añade campos faltantes a colecciones existentes
- Advierte sobre conflictos de tipo de campo
-
Ejecutar la importación
Pulsa Importar contenido. Verás el progreso por cada elemento.
-
Importar medios (opcional)
Tras el contenido, elige si descargar archivos multimedia. EmDash:
- Descarga desde tus URLs de WordPress
- Deduplica por hash de contenido
- Reescribe URLs en el contenido automáticamente
Conversión de contenido
Gutenberg a Portable Text
EmDash convierte bloques de Gutenberg a Portable Text, un formato estructurado.
| Bloque Gutenberg | Portable Text | Notas |
|---|---|---|
core/paragraph | block style=“normal” | Marcas en línea conservadas |
core/heading | block style=“h1-h6” | Nivel desde atributos |
core/image | block image | Referencia de medio actualizada |
core/list | block con tipo listItem | Ordenadas y no ordenadas |
core/quote | block style=“blockquote” | Cita incluida |
core/code | block code | Atributo de idioma conservado |
core/embed | block embed | URL y proveedor almacenados |
core/gallery | block gallery | Array de referencias a imágenes |
core/columns | block columns | Contenido anidado conservado |
| Bloques desconocidos | htmlBlock | HTML sin procesar para revisión |
Los bloques desconocidos se guardan como htmlBlock con HTML y metadatos originales. Puedes revisarlos y convertirlos manualmente o crear componentes Portable Text personalizados.
Contenido del editor clásico
El HTML del editor clásico se convierte en bloques Portable Text. Estilos en línea (<strong>, <em>, <a>) pasan a ser marcas en spans.
Asignación de estados
| Estado WordPress | Estado EmDash |
|---|---|
publish | published |
draft | draft |
pending | pending |
private | private |
future | scheduled |
trash | archived |
Importación de taxonomías
Categorías y etiquetas se importan como taxonomías conservando la jerarquía:
WordPress: EmDash:
├── Categories (hierarchical) ├── taxonomies table
│ ├── News │ ├── category/news
│ │ ├── Local │ ├── category/local (parent: news)
│ │ └── World │ ├── category/world (parent: news)
│ └── Sports │ └── category/sports
└── Tags (flat) └── content_taxonomies junction
├── featured ├── tag/featured
└── breaking └── tag/breaking
Campos personalizados y ACF
Los metadatos de entradas y los campos ACF se analizan durante la importación:
-
Fase de análisis
El asistente detecta campos personalizados y sugiere tipos de campo EmDash:
Custom Fields: ├── subtitle (string, 45 posts) ├── _yoast_wpseo_title → seo.title (string, 127 posts) ├── _thumbnail_id → featuredImage (reference, 89 posts) └── price (number, 23 posts) -
Asignación de campos
Los campos internos de WordPress (que empiezan por
_edit_,_wp_) están ocultos por defecto. Los campos de plugins SEO se mapean a un objetoseo. -
Inferencia de tipos
EmDash infiere tipos a partir de valores:
- Cadenas numéricas →
number "1","0","true","false"→boolean- Fechas ISO →
date - PHP/JSON serializado →
json - IDs de WordPress (p. ej.
_thumbnail_id) →reference
- Cadenas numéricas →
Redirecciones de URL
Tras la importación, EmDash genera un mapa de redirecciones:
{
"redirects": [
{ "from": "/?p=123", "to": "/posts/hello-world" },
{ "from": "/2024/01/hello-world/", "to": "/posts/hello-world" },
{ "from": "/category/news/", "to": "/categories/news" }
],
"feeds": [
{ "from": "/feed/", "to": "/rss.xml" },
{ "from": "/feed/atom/", "to": "/atom.xml" }
]
}
Aplica estas redirecciones en:
- Reglas de redirección de Cloudflare
- La configuración de redirecciones de tu hosting
- La opción
redirectsde Astro enastro.config.mjs
Tabla de referencia de conceptos
Usa esta tabla al adaptar patrones de WordPress a EmDash:
| WordPress | EmDash | Notas |
|---|---|---|
register_post_type() | Colección en el admin | Creada desde panel o API |
register_taxonomy() | Taxonomía o campo array | Según complejidad |
register_meta() | Campo en el esquema de colección | Tipado, no clave-valor |
WP_Query | getCollection(filters) | Consultas en tiempo de ejecución |
get_post() | getEntry(collection, id) | Devuelve entrada o null |
wp_insert_post() | POST /_emdash/api/content/{type} | REST API |
the_content | <PortableText value={...} /> | Renderizado Portable Text |
add_shortcode() | Bloque personalizado Portable Text | Componente renderer propio |
register_block_type() | Bloque personalizado Portable Text | Igual que shortcodes |
add_menu_page() | Página admin del plugin | Bajo /_emdash/admin/ |
add_action/filter() | Hooks del plugin | hooks.content:beforeSave |
wp_options | ctx.kv | Almacén clave-valor |
wp_postmeta | Campos de colección | Estructurado |
$wpdb | ctx.storage | Acceso directo al almacenamiento |
| Categorías/Etiquetas | Taxonomías | Jerarquía conservada |
Importación por API (avanzado)
La importación de WordPress está disponible en el panel y en la REST API. Para la mejor experiencia usa el asistente: ofrece mapeo de campos, resolución de conflictos y seguimiento del progreso.
Los endpoints de importación están bajo /_emdash/api/import/wordpress/ para acceso programático.
Solución de problemas
«XML parsing error»
El archivo de exportación puede estar corrupto o incompleto. Vuelve a exportar desde WordPress.
Fallos al descargar medios
Algunas imágenes pueden estar protegidas o haber cambiado de URL. La importación continúa y las URLs fallidas quedan registradas.
Conflictos de tipo de campo
Si una colección existente tiene un campo con tipo incompatible, el asistente muestra el conflicto. Opciones:
- Renombrar el campo en EmDash
- Cambiar el mapeo del campo en WordPress
- Eliminar y recrear la colección
Exportaciones grandes
Para exportaciones de más de 100 MB:
- Exporta tipos de entrada por separado en WordPress
- Importa cada archivo en secuencia
- Usa la CLI con
--resumepara mayor fiabilidad
Próximos pasos
- Content Import — Otras fuentes y métodos de importación
- Plugin Porting — Migrar la funcionalidad de plugins de WordPress
- Working with Content — Consultar y renderizar el contenido importado