Commits

El migrador ja parla amb el WordPress de producció

Primer pilot contra el WordPress real: autenticació dual, prefixos de taules,

Fa tres setmanes que el migrador (l'script que passa el contingut del WordPress vell al nou gestor) 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 (unes eines de WordPress per classificar contingut). 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ó (demostrar-li al sistema qui ets). El plugin d'API keys de Payload —claus que identifiquen un programa davant d'un altre— 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, un token d'accés), 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 (la llibreria que fa les consultes SQL des de Python) 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: repetir-los no duplica res) 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 (les versions que exigeix de les veïnes) 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 (proves ràpides del bàsic), dos pilots importats amb portada i meta descripció, i la sensació que la fase 3 per fi camina sola. La continuació, a El dissabte més dens: editor, ingesta i un DNS que es va apagar; la publicitat també acabaria travessant el pont a La publicitat s'importa: Advanced Ads cap a Payload.