VM Sync Bridge sincroniza contenidos entre dos sitios WordPress (por ejemplo, desarrollo → producción o staging ↔ producción) usando el mismo plugin en ambos.
Soporta páginas, entradas y CPT, taxonomías, metadatos (incluyendo Elementor: _elementor_data, _elementor_css), usuarios/autores (mapeo), y medios (subida/dedupe por hash).
Incluye reemplazo seguro de dominios (dev → prod) incluso dentro de JSON de Elementor y campos serializados, barra de progreso en la UI, reintentos, logs y WP-CLI.


¿Cómo funciona (flujo técnico)?

  1. Emisor selecciona qué sincronizar (un post, lote o automático al guardar).

  2. Serializa el contenido (post + meta + taxonomías + adjuntos), normaliza ID/SLUG y aplica reemplazo de URL (dev → prod).

  3. Envía un payload firmado (HMAC) al Receptor por REST: /wp-json/vm-sync/v1/push.

  4. El Receptor valida firma/permiso/IP, resuelve colisiones por:

    • external_uuid (ID externo persistente)

    • o por slug + post_type.

  5. Crea/actualiza el recurso, descarga medios si faltan (dedupe por SHA1/MD5), re-escribe rutas locales y confirma estado al Emisor.

  6. El Emisor actualiza la barra de progreso y registra log (éxitos/errores, tiempos y difs básicas).

Resolución de conflictos: por defecto “last-write-wins” con comparación de modified_gmt. Opcional: bloquear si el destino es más reciente.


Requisitos

  • WordPress 5.8+, PHP 7.4+.

  • Instalar el plugin en ambos sitios.

  • Permitir llamadas REST entre ambos (sin WAF que bloquee JSON).

  • wp-cron activo si usas reintentos en segundo plano.


Configuración rápida (paso a paso)

1) Instalar en ambos sitios

  • Sube/activa el plugin en Origen (Emisor) y Destino (Receptor).

2) Configurar el Receptor (sitio destino)

En Ajustes → VM Sync Bridge → Receptor:

  • Estado receptor: ✅ Activado.

  • Clave secreta (Token compartido): genera una clave larga (32+ chars).

  • Permisos mínimos: manage_options (recomendado) o un rol específico.

  • Whitelist IP (opcional): IP del Emisor para endurecer seguridad.

  • Política de conflictos: last-write-wins o bloquear si destino más nuevo.

  • Política de medios: reutilizar si hash coincide, descargar si no existe.

  • (Opcional) Prefijo/espacio de nombres para external_uuid si recibes de varios orígenes.

Prueba de salud: pulsa “Probar endpoint receptor” para ver pong, hora del servidor y versión.

3) Configurar el Emisor (sitio origen)

En Ajustes → VM Sync Bridge → Emisor:

  • URL del Receptor: https://tusitio-destino.com.

  • Token compartido: pega el del Receptor.

  • Reemplazo de dominios:

    • Buscar: https://dev.tusitio.com

    • Reemplazar por: https://www.tusitio.com

  • Qué sincronizar: checkboxes por post types y taxonomías.

  • Mapeos:

    • Estados: draft → draft, publish → publish (configurable).

    • Autores: por email (si no existe, crea o asigna a uno por defecto).

    • Categorías/Tags: por slug; si no existe, crea.

  • Elementor: activar “Analizar JSON y reemplazar URLs en _elementor_data”.

  • Automatización:

    • Sincronizar al guardar (hook en save_post)

    • o enviar manual (botón)

    • o lotes (por fechas/IDs).

  • WP-CLI (opcional): habilitar.

4) Handshake

Desde el Emisor, pulsa “Probar conexión”. Debe responder con:

  • ok: true, versión del receptor, reloj del servidor y firma validada.

5) Primer envío de prueba

Entra a una página/entrada → pulsa “Sincronizar ahora”.
Observa la barra de progreso, y revisa en el Receptor que el contenido aparece con medios, meta y Elementor correctos.


Modos de uso

  • Desde el editor: botón “Sincronizar ahora” (post único).

  • Acción masiva en listados: selecciona varios y “Enviar al receptor”.

  • Lotes por filtro: por rango de fechas, tipo, estado o taxonomías.

  • Auto-sync al guardar: ideal en staging hacia producción.

  • WP-CLI (si lo activas):

     
    # Enviar un post por ID wp vm-sync push --post=324 # Enviar por tipo y fecha wp vm-sync push --post_type=page --date_after=2025-01-01 # Reintentar fallidos wp vm-sync retry # Probar conexión wp vm-sync ping --to=https://www.tusitio.com --token=SECRETO

Qué sincroniza (detalle)

  • Post básico: título, contenido, extracto, slug, estado, fecha/autor.

  • Metadatos: todos los meta salvo una lista de exclusión (definible).

  • Elementor: _elementor_data (JSON) y _elementor_css (re-gen si procede).

  • Taxonomías: categorías, etiquetas y tax personalizadas (por slug).

  • Medios: adjuntos del post; dedupe por hash para evitar duplicados.

  • Campos serializados: reemplazo seguro (busca/rehace serialización).

  • GUID: no se toca; la URL pública se gestiona en postmeta/contenido.


Seguridad

  • HMAC con token compartido en cada petición.

  • Validación de capabilities y nonce en acciones de UI.

  • Whitelist IP opcional en Receptor.

  • Rate-limit y bloqueo temporal tras intentos fallidos.

  • Logs con redacción parcial (no guarda tokens en claro).


Logs, reintentos y progreso

  • UI de progreso: porcentaje por lote y por post (medios incluidos).

  • Registro: fecha, post ID origen/destino, duración, dif de campos críticos.

  • Reintentos: cola para fallos (HTTP 429/5xx o validaciones temporales).

  • Exportar log: CSV desde la pantalla del plugin.


Buenas prácticas

  • Haz un primer sync en staging.

  • Define lista de metadatos excluidos (por ej., cachés o flags locales).

  • Si usas cachés/persistentes, purga tras sincronizar bloques pesados.

  • Si mueves Elementor, regenera CSS en destino si ves desajustes (Elementor → Herramientas → Regenerar CSS).


Solución de problemas (rápidas)

  • 401/403: token incorrecto, role/capability insuficiente o WAF bloqueando REST.

  • Medios no aparecen: permisos de subida en destino o URLs sin reemplazar; revisa el log de adjuntos.

  • JSON/Elementor roto: activa el reemplazo profundo en _elementor_data; purga caché y regenera CSS.

  • Diferencias de autor: activa mapeo por email y define autor por defecto.