Migracio de dades
Migracio LearnDash a Moodle
Suite d'eines per migrar contingut formatiu des de WordPress/LearnDash a Moodle amb parseo XML, neteja d'HTML, catalog i remapeig visual.
Context
Dues webs WordPress amb LearnDash contenien centenars de cursos, milers d'usuaris i anys de progres acumulat que calia migrar a Moodle. El contingut estava emmagatzemat en formats propietaris (Elementor JSON, metadades serialitzats PHP) que no eren directament portables.
Que fa
Pipeline de 6 fases amb fitxers intermitjos (JSON/CSV) com a font de veritat:
- Extraccio: parseo XML WXR, extraccio de contingut Elementor des de _elementor_data, neteja d'HTML (eliminacio de scripts, styles, atributs data-*)
- Catalog: JSON unificat amb relacions curs-leccio ordenades, proposta automatica de remapeig per similitud (SequenceMatcher)
- Revisio: interficia web en port 8765 amb cerca, assignacio, drag-and-drop de lecciones, editor WYSIWYG inline
- Recursos: deteccio i descarrrega de PDFs, imatges, audios, videos amb manifest CSV
- Usuaris: consolidacio per email des de multiples webs WordPress, fusio de identitats
- Importacio: plugin Moodle (local_ldmigrate) amb API externa idempotent per crear pagines i recursos
Dificultats principals
- Contingut Elementor emmagatzemat com JSON serialitzat en metadata, no com HTML renderitzat
- HTML ple d'atributs data-* i classes propietaries no portables
- Relacions curs-leccio disperses en metadades serialitzats PHP amb formats no documentats
- IDs numerics que col.lisionaven entre multiples webs
- URLs amb caracters especials (accents, espais codificats) que fallaven en descarrregues
- Progres LearnDash serialitzat com JSON en wp_usermeta
Solucions
- Parser propi d'Elementor JSON: walk recursiu de widgets coneguts cap a HTML semantic
- Regex sistemica: eliminacio de scripts/styles/noscript, atributs data-/aria-/elementor-*, conservant href/src/alt/title
- Parser de metadades serialitzats PHP per extreure IDs de lecciones ordenades
- source_user_key amb prefix de site per desambiguar IDs entre webs
- request_url(): normalitzacio IDNA de dominis + URL-encoding selectiu
- Plugin Moodle amb idempotencia per idnumber: evita duplicats en re-execucions
Aprenentatges
- Automatitzar el 90% mecanic i deixar pantalla/CSV per al 10% ambigu
- Fitxers intermitjos (JSON/CSV) com a font de veritat permeten pausar i reprendre la migracio
- Zero dependencies externes (solo stdlib Python) simplifica desplegament i evita conflictes de versions
- Un plugin Moodle local amb API externa es mes segur que manipular la BD directament