Table of Contents
Sincronización local → producción (wp-nuevo)
Actualizado 2026-06-15. Prod =
/web/wp-nuevo/en134.0.10.170(mismo server que el Joomla). El método conparamiko+ base64 del.orgviejo ya no se usa: ahorasshpassytarestán disponibles.
Antes de tocar nada, lee Limitaciones del servidor de producción.
Regla general: los IDs y el código viven en paralelo entre local y prod (misma migración). Replica los cambios del mismo modo y mantén los IDs sincronizados.
Acceso
export SSHPASS='C6c2A!mAl3Wj.BQF'
SSH="sshpass -e ssh -o StrictHostKeyChecking=accept-new feadulta@134.0.10.170"
WP="cd /web/wp-nuevo && wp --skip-plugins --skip-themes"
Subir ficheros (scp/sftp NO funcionan)
Fichero único (binario-safe):
$SSH 'cat > /web/wp-nuevo/wp-content/.../destino.png' < /local/fichero.png
$SSH 'wc -c /web/wp-nuevo/wp-content/.../destino.png' # verificar tamaño (no hay stat)
Muchos ficheros → empaquetar y extraer con tar (sí existe en prod):
tar czf /tmp/bundle.tgz -C /local/dir subcarpeta/ # ojo a las rutas relativas del tar
$SSH 'cat > /web/wp-nuevo/wp-content/uploads/bundle.tgz' < /tmp/bundle.tgz
$SSH 'cd /web/wp-nuevo/wp-content/uploads && tar xzf bundle.tgz && rm bundle.tgz'
mu-plugins (fea-homepage.php, carta-semana-plugin.php)
# backup primero (no hay mysqldump/stat; cp sí)
$SSH 'cp /web/wp-nuevo/wp-content/mu-plugins/fea-homepage.php /entrada/fea-homepage.php.bak-$(date +%Y%m%d-%H%M)'
# subir
$SSH 'cat > /web/wp-nuevo/wp-content/mu-plugins/fea-homepage.php' < wordpress/wp-content/mu-plugins/fea-homepage.php
⚠️ No copiar
post_contentlocal→prod: mete URLs defarmer.taild3aaf6.ts.net. Transformar siempre sobre el contenido descargado de prod (wp post get ID --field=content), preservando sus URLswp-nuevo.feadulta.com.
Posts / metas / opciones
Vía wp eval-file (sube el .php con cat > y ejecútalo). proc_open off → no wp db query/import; usar wp eval, wp post update ID /ruta/fichero, o mysql directo.
$SSH 'cat > /web/wp-nuevo/script.php' < script.php
$SSH 'cd /web/wp-nuevo && APPLY=1 wp --skip-plugins --skip-themes eval-file script.php'
Verificar (Cloudflare bloquea curl/headless)
Server-side únicamente, o pedir a Rafa que mire en el navegador:
$SSH 'cd /web/wp-nuevo && wp --skip-plugins --skip-themes post get ID --field=content'
$SSH 'cd /web/wp-nuevo && wp --skip-plugins --skip-themes eval "echo wp_get_attachment_url(ID);"'
$SSH 'cd /web/wp-nuevo && wp --skip-plugins --skip-themes cache flush'
Sincronizar IDs entre local y prod
Los IDs de objetos suelen coincidir local↔prod (menú 1, archive 26561, cabecera 42366, pie 42370, template single 42359). Si difieren, mover con offset temporal +99000 para evitar conflictos de PK:
UPDATE wp_posts SET ID = ID + 99000 WHERE ID IN (...);
UPDATE wp_postmeta SET post_id = post_id + 99000 WHERE post_id IN (...);
UPDATE wp_term_relationships SET object_id = object_id + 99000 WHERE object_id IN (...);
-- luego mover a los IDs finales
Ejemplo real: despliegue de avatares (issue #62, 2026-06-15)
Patrón completo de referencia (genera PNGs en local → tar → ssh cat → tar xzf → wp eval-file que crea attachments y reapunta foto_perfil, con backup en _foto_perfil_pre62):
- Generar ficheros en local (
/tmp/...→uploads/avatares/autores/). tar czfcon rutas relativas correctas + manifestuids.json+ script importer.ssh 'cat > .../bundle.tgz'< bundle ·tar xzf.APPLY=1 wp eval-file import_prod_62.php(dry-run sinAPPLY).- Verificar server-side con
wp eval(contar reapuntados); limpiar caché.
Scripts en wordpress/wp-content/uploads/avatares/ (local). Ver master-feadulta.md para detalle.