Table of Contents
- Scripts de migración
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 43914–44082.
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 44083–44090.
import_new_content.py
Importa ítems de ew4r_content que NO son cartas (multimedia, noticias, tablón). 58 items → WP IDs 44091–44151.
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.