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:

  1. Extraccio: parseo XML WXR, extraccio de contingut Elementor des de _elementor_data, neteja d'HTML (eliminacio de scripts, styles, atributs data-*)
  2. Catalog: JSON unificat amb relacions curs-leccio ordenades, proposta automatica de remapeig per similitud (SequenceMatcher)
  3. Revisio: interficia web en port 8765 amb cerca, assignacio, drag-and-drop de lecciones, editor WYSIWYG inline
  4. Recursos: deteccio i descarrrega de PDFs, imatges, audios, videos amb manifest CSV
  5. Usuaris: consolidacio per email des de multiples webs WordPress, fusio de identitats
  6. 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