Desenvolupament web
El migrador ja parla amb el WordPress de producció
Primer pilot contra el WordPress real: autenticació dual, prefixos de taules, catàlegs de comarques i HTML de Gutenberg convertit a Lexical.

Fa tres setmanes que el migrador treballava amb dades de prova. Avui l’he posat davant del WordPress real: la base de dades de producció, amb els seus prefixes raríssims i les taxonomies de Toolset. La fase 3 ja no és un esbós: el pilot importa.
Dues portes per entrar a Payload
El primer problema ni tan sols era de migració: era d’autenticació. El plugin d’API keys de Payload demana configuració manual des de la interfície, i jo volia un camí que funcionés sempre. Solució: mode doble. Si hi ha PAYLOAD_API_KEY, s’usa API key; si no, login amb email i contrasenya (JWT), que funciona out-of-the-box. I si no hi ha res de res, l’script s’atura amb un RuntimeError que ho explica.
Trobar les taules bones
Per detectar el prefix de les taules WordPress feia un LIKE '%\_posts'. PyMySQL se’l menja com un especificador de format, i a més el primer candidat que sortia era una taula de Mailpoet, no del core. Dues correccions: escapar el percentatge (%%) i creuar amb les taules *_options, que són les que delaten el core de WordPress. Si n’hi ha vàries de candidates, guanya el prefix més curt.
Comarques, municipis i detalls que no perdonen
Al primer pilot res no enllazava: les comarques no es resolien a IDs, el seed deia berguedà amb accent i el WordPress el té sense, i Payload volia enters on li passava strings. Ara els catàlegs de comarques i municipis es creen sols (idempotents) i les relacions van amb el tipus correcte. Per a Bagà n’han sortit 13 posts: 1 de cultura i 12 esdeveniments del calendari.
D’HTML de Gutenberg a Lexical
El contingut del WP arribava amb comentaris <!-- wp:paragraph --> que Payload escapava i mostrava literalment a la pàgina. He reescrit el conversor amb html.parser: neteja els comentaris de Gutenberg, mapeja paràgrafs, encapçalaments i llistes, i conserva negretes i cursives dins del text. Els enllaços, a més, demanaven camps extra al node (id, direction, format): sense ells, l’admin petava amb un React error #418 i amagava tots els camps richText. Amb el parser nou, les dues peces de l’últim pilot es veuen netes al frontend.
De passada: dependències al dia
He aprofitat per posar Payload 3.89, Next 15.4.11 i React 19.0.1: el peer dep de Payload ho exigia. L’error #418 ha sobreviscut l’actualització, que era una altra pista que era estructural i no de versió.
Balanç del dia: 29 smoke tests en verd, dos pilots importats amb portada i meta descripció, i la sensació que la fase 3 per fi camina sola.