Importación de contenido

En esta página

EmDash importa contenido desde WordPress y otras plataformas. Cada fuente de importación detecta una plataforma, analiza su contenido y lo obtiene en tu sitio.

Fuentes de importación

ID de fuentePlataformaSondeoOAuthImportación completa
wxrArchivo de exportación WordPressNoNo
wordpress-comWordPress.com
wordpress-restWordPress autoalojadoNoSolo sondeo

Subida de archivo WXR

El método de importación más completo. Sube un archivo de exportación WordPress eXtended RSS (WXR) directamente al panel de administración.

Capacidades:

  • Todos los tipos de entrada (incluidos los personalizados)
  • Todos los campos meta
  • Borradores y entradas privadas
  • Jerarquía completa de taxonomías
  • Metadatos de adjuntos de medios

Cómo obtener un archivo WXR:

  1. En el admin de WordPress, ve a Herramientas → Exportar
  2. Selecciona Todo el contenido o tipos de entrada específicos
  3. Haz clic en Descargar archivo de exportación
  4. Sube el archivo .xml a EmDash

OAuth de WordPress.com

Para sitios alojados en WordPress.com, conéctate vía OAuth para importar sin exportaciones manuales de archivos.

  1. Introduce la URL de tu sitio WordPress.com
  2. Haz clic en Conectar con WordPress.com
  3. Autoriza EmDash en la ventana emergente de WordPress.com
  4. Selecciona el contenido a importar

Qué incluye:

  • Contenido publicado y borradores
  • Entradas privadas (con autorización)
  • Archivos de medios vía API
  • Campos personalizados expuestos a la REST API

Sondeo de la REST API de WordPress

Cuando introduces una URL, EmDash sondea el sitio para detectar WordPress y mostrar el contenido disponible:

Detectado: WordPress 6.4
├── Entradas: 127 (publicadas)
├── Páginas: 12 (publicadas)
└── Medios: 89 archivos

Nota: Los borradores y contenido privado requieren autenticación
o una exportación WXR completa.

El sondeo REST es informativo. Para importaciones completas, sugiere subir un archivo WXR o conectarse vía OAuth (para WordPress.com).

Flujo de importación

Todas las fuentes siguen el mismo flujo:

┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Conectar  │────▶│   Analizar  │────▶│   Preparar  │────▶│   Ejecutar  │
│  (sondear/  │     │  (verificar │     │   (crear    │     │  (importar  │
│   subir)    │     │   esquema)  │     │   esquema)  │     │  contenido) │
└─────────────┘     └─────────────┘     └─────────────┘     └─────────────┘

Paso 1: Conectar

Introduce una URL para sondear o sube un archivo directamente.

El sondeo de URL ejecuta todas las fuentes registradas en paralelo. La coincidencia con mayor confianza determina la acción sugerida:

  • Sitio WordPress.com → Ofrecer conexión OAuth
  • WordPress autoalojado → Mostrar instrucciones de exportación
  • Desconocido → Sugerir subida de archivo

Paso 2: Analizar

La fuente analiza el contenido y verifica la compatibilidad del esquema:

Tipos de entrada:
├── post (127) → posts [Nueva colección]
├── page (12)  → pages [Existente, compatible]
├── product (45) → products [Añadir 3 campos]
└── revision (234) → [Omitir - tipo interno]

Cambios de esquema requeridos:
├── Crear colección: posts
├── Añadir campos a pages: featured_image
└── Crear colección: products

Cada tipo de entrada muestra su estado:

EstadoSignificado
ListoLa colección existe con campos compatibles
Nueva colecciónSe creará automáticamente
Añadir camposLa colección existe, se añaden campos faltantes
IncompatibleConflictos de tipo de campo (corrección manual necesaria)

Paso 3: Preparar esquema

Haz clic en Crear esquema e importar para:

  1. Crear nuevas colecciones
  2. Añadir campos faltantes con los tipos de columna correctos
  3. Configurar tablas de contenido con índices

Paso 4: Ejecutar importación

El contenido se importa secuencialmente:

  • Gutenberg/HTML convertido a Portable Text
  • Estado de WordPress mapeado a estado de EmDash
  • Autores de WordPress mapeados a propiedad (authorId) y bylines de presentación
  • Taxonomías creadas y vinculadas
  • Bloques reutilizables (wp_block) importados como Secciones
  • Progreso mostrado en tiempo real

Comportamiento de importación de autores:

  • Si un mapeo de autor apunta a un usuario de EmDash, la propiedad se establece a ese usuario y se crea/reutiliza un byline vinculado para el mismo usuario.
  • Si no hay mapeo de usuario, se crea/reutiliza un byline de invitado a partir de la identidad del autor de WordPress.
  • Las entradas importadas obtienen créditos de byline ordenados, con el primer crédito establecido como primaryBylineId.

Paso 5: Importación de medios (Opcional)

Después del contenido, opcionalmente importa los medios:

  1. Análisis — Muestra conteos de adjuntos por tipo

    Medios encontrados:
    ├── Imágenes: 75 archivos
    ├── Vídeo: 10 archivos
    └── Otros: 4 archivos
  2. Descarga — Transmite desde URLs de WordPress con progreso

    Importando medios...
    ├── 45 de 89 (50%)
    ├── Actual: vacation-photo.jpg
    └── Estado: Subiendo
  3. Reescritura de URLs — El contenido se actualiza automáticamente con las nuevas URLs

La importación de medios usa hashing de contenido (xxHash64) para deduplicación. La misma imagen usada en múltiples entradas se almacena una sola vez.

Endpoints de API

El sistema de importación expone estos endpoints:

Sondear URL

Detecta la plataforma detrás de una URL con una solicitud de sondeo:

POST /_emdash/api/import/probe
Content-Type: application/json

{ "url": "https://example.com" }

La respuesta contiene la plataforma detectada y la acción sugerida.

Analizar WXR

Sube un archivo WXR para analizar sus tipos de entrada y compatibilidad de esquema:

POST /_emdash/api/import/wordpress/analyze
Content-Type: multipart/form-data

file: [Exportación WordPress .xml]

La respuesta contiene el análisis de tipos de entrada con compatibilidad de esquema.

Preparar esquema

Crea las colecciones y campos para los tipos de entrada seleccionados:

POST /_emdash/api/import/wordpress/prepare
Content-Type: application/json

{
  "postTypes": [
    { "name": "post", "collection": "posts", "enabled": true }
  ]
}

Ejecutar importación

Importa el contenido a las colecciones especificadas:

POST /_emdash/api/import/wordpress/execute
Content-Type: multipart/form-data

file: [Exportación WordPress .xml]
config: { "postTypeMappings": { "post": { "collection": "posts" } } }

Importar medios

Descarga y almacena los adjuntos de medios referenciados por la importación:

POST /_emdash/api/import/wordpress/media
Content-Type: application/json

{
  "attachments": [{ "id": 123, "url": "https://..." }],
  "stream": true
}

La respuesta transmite actualizaciones de progreso NDJSON durante la descarga/subida.

Reescribir URLs

Reemplaza las URLs de medios antiguas en el contenido importado con sus equivalentes almacenadas:

POST /_emdash/api/import/wordpress/rewrite-urls
Content-Type: application/json

{
  "urlMap": { "https://old.com/image.jpg": "/_emdash/media/abc123" }
}

Manejo de errores

Errores recuperables

  • Timeout de red — Reintento con backoff
  • Fallo de análisis de un elemento — Registrado, omitido, la importación continúa
  • Fallo de descarga de medios — Marcado para manejo manual

Errores fatales

  • Formato de archivo inválido — La importación se detiene con mensaje de error
  • Conexión a base de datos perdida — La importación se pausa, permite reanudar
  • Cuota de almacenamiento excedida — La importación se detiene, muestra el uso

Informe de errores

Después de que una importación se completa, EmDash muestra un resumen de lo que tuvo éxito, lo que se ajustó y lo que falló:

Importación completada

✓ 125 entradas importadas
✓ 12 páginas importadas
✓ 85 referencias de medios registradas

⚠ 2 elementos tuvieron advertencias:
  - Entrada "Special Characters ñ" - codificación de título corregida
  - Página "About" - slug duplicado renombrado a "about-1"

✗ 1 elemento falló:
  - ID de entrada 456 - error de análisis de contenido (guardado como borrador)

Los elementos fallidos se guardan como borradores con el contenido original en _importError para revisión.

Fuentes personalizadas

Para importar desde una plataforma que las fuentes integradas no cubren, implementa la interfaz ImportSource y regístrala en la integración:

import { mySource } from "./src/import/custom-source";

export default defineConfig({
	integrations: [
		emdash({
			import: { sources: [mySource] },
		}),
	],
});

La interfaz (probe, analyze, fetchContent) y la forma de salida normalizada están documentadas en Arquitectura (internos).

Próximos pasos