2
Scripts de migracion
rafa edited this page 2026-05-25 15:38:56 -04:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Scripts de migración

Todos en /home/rafa/joomla-migration/scripts/. Trackeados en git.

Scripts del delta de mayo 2026

import_new_k2_items.py

Importa K2 items nuevos de Joomla (id > 17873) vía SSH + HEX. Resultado: 169 items → WP IDs 4391444082.

fix_imported_k2_metas.py

Asigna metas, categorías y Polylang a los K2 items ya creados. Usa offset wp_id = k2_id + 26040 para mapear.

import_new_cartas.py

Importa cartas (catid 27/40/41, id > 9043) y asigna _carta_id a los K2 items por matching de fecha. Resultado: 8 cartas nuevas → WP IDs 4408344090.

import_new_content.py

Importa ítems de ew4r_content que NO son cartas (multimedia, noticias, tablón). 58 items → WP IDs 4409144151.

Notas técnicas comunes a los scripts de delta

Estos son los problemas reales que aparecieron cuando se escribieron los scripts. No los olvides al hacer otro delta.

1. HEX() para campos con HTML

Las queries por SSH usan HEX(campo) para evitar que el HTML con saltos de línea y caracteres especiales rompa el parsing TSV cuando el resultado vuelve por stdout.

SELECT id, HEX(content) FROM ew4r_k2_items WHERE id > ...

Luego en Python: bytes.fromhex(row[1]).decode('utf-8').

2. Query por stdin

Pasar la query SQL por stdin (input=query en subprocess.run) para evitar problemas con backticks, comillas y caracteres de shell.

res = subprocess.run(['ssh', host, 'mysql -uX -pY db'],
                     input=query, capture_output=True, text=True)

3. MAX(ID) en vez de LAST_INSERT_ID()

SELECT MAX(ID) FROM wp_posts;   -- ✅
SELECT LAST_INSERT_ID();         -- ❌ cada subprocess abre sesión MySQL nueva

Cada llamada SSH abre una sesión MySQL distinta, así que LAST_INSERT_ID() no ve el INSERT del subprocess anterior.

4. MySQL strict mode

Los INSERT wp_posts deben incluir todos los campos obligatorios incluso si están vacíos:

to_ping = ''
pinged = ''
post_content_filtered = ''

Si no, MySQL rechaza el INSERT con strict mode.

Otros scripts en scripts/

Importación inicial (ya ejecutados)

Script Estado
assign_author_photos.php ejecutado
assign_polylang_languages.php ejecutado
assign_polylang_prod.php ejecutado en prod
export_translations.py / export_cat_translations.py Exportadores de traducciones
audit_translations.py Auditor de cobertura de traducciones
retranslate_*.py (5 ficheros) Re-traducción por chunks/idiomas/fallos
fix_joomla_links.php 2026-03-04: 93.030 links reemplazados en 3.400 posts
fix_numeric_categories.php 2026-03-04: 100 categorías numéricas → autores correctos
fix_remaining_titles.py, fix_titles.py Normalización de títulos
generate_k2_redirects.php 2026-03-04: 17.853 redirects 301 en wp_fg_redirect
translate_cartas.py Traducción de cartas semanales
setup-wordpress.sh Setup inicial del WP local
test_5articles.py Test smoke de 5 artículos
cutover_feadulta_com.sh Cutover DNS — ver Cutover DNS
fix_image_paths.php 2026-05-25: reescribe images/.../fea/wp-content/uploads/... (458+124 posts, #34+#36)
import_avatars.php 2026-05-25: 736 avatares user_meta foto_perfil desde Joomla (#39)
face_crop_avatar.py 2026-05-25: face-crop con OpenCV de 724 col_*.png antes de import (#39)
regen_avatars.php 2026-05-25: regenera thumbnails WP de attachments cropped (#39)

Regeneración de la clasificación

Script Notas
regenerar_clasificacion_csv.py Reproduce clasificacion_articulos.csv recorriendo todas las cartas (cat 6+21+22) y extrayendo links agrupados por encabezado. Paridad con mu-plugins/fea-carta-portada.php (#38). Cubre 5 secciones core (comentario, articulo, eucaristia, multimedia, effa). NO cubre granularidad fina del CSV histórico (lectura, comentario_editorial, otro, noticia) ni encabezados de fiestas especiales. Usa pymysql para evitar problemas de parsing del CLI con HTML multilínea. Ver #42.
# Regenerar y comparar contra el CSV de marzo 2026
python3 scripts/regenerar_clasificacion_csv.py \
  --out /tmp/clasif_new.csv \
  --diff clasificacion_articulos.csv

Output diff típico tras una pasada (2026-05-25): 8.655 posts con mismas cats, 1.599 con cats distintas (mayoría son granularidad: viejo distingue lectura/comentario_editorial, nuevo agrupa todo en comentario).

Templates / mu-plugins

Fichero Notas
fea-homepage.php Versión de trabajo de portada/shortcodes (también en wp-content/mu-plugins/)
fea-homepage-template.php Template suelto
carta-semana-plugin.php Versión de trabajo del plugin de carta de la semana

Bug conocido wp-cli + categorías numéricas

wp post term set <ID> category 28    # ❌ crea término "28"
wp post term set <ID> category evangelios-y-comentarios   # ✅

wp post term set ID category N interpreta N como nombre, no como term_id.

Regla: siempre usar slug. Ver Evangelios y comentarios.

Bug conocido wp-cli en prod

wp --path=/web/ db query "SELECT ..."   # ❌ FALLA (proc_open desactivado)

proc_open está desactivado en el server. wp db query y todo lo que invoque mysql por dentro falla. Usar mysql directo vía SSH para queries.

Ver Limitaciones del servidor de producción.