WP > Drupal

 

Hrm. Ik ben wat aan het prutselen om te kijken hoe WordPress naar Drupal om te zetten. Zuiver theoretisch voor het moment, om te kijken of Gentblogt in Drupal zou te wurmen zijn.

Er is een zeer goeie WordPress-import-module voor Drupal, zeer toepasselijk WordPress Import genoemd: die importeert artikels, commentaren, auteurs, en zorgt ervoor dat alle oude permallinks blijven kloppen door URL aliases aan te maken.

Maar: custom fields worden niet overgenomen. En op Gentblogt steken we auteurs die geen redactie zijn, en fotografen, en nog wat andere dingen, in custom fields.

Eens kijken of het manueel kan.

Een lijstje van alle auteurs uit WordPress halen, is simpel:

select post_id, meta_value from wp_postmeta where meta_key='auteur' order by meta_value

Ik krijg 844 verschillende auteurs, gekoppeld aan 2367 artikels, maar bij de import naar Drupal is de WordPress-post_id helaas wel verloren gegaan. Helemaal vanzelfsprekend te koppelen zijn die dingen niet, maar de permalink zit er wél in, dankzij die importmodule. En het geluk wil dat die permalink redelijk simpel in mekaar zit: /jaar/maand/dag/post-slug.

Dus hoppa, één minuskuul stapje meer:

select concat(date_format(post_date,'/%Y/%m/%d/'), post_name) permalink, meta_value auteur from wp_postmeta, wp_posts where wp_posts.id=post_id and meta_key='auteur' order by post_date

En dat geeft propertjes, voor de laatste tien dagen bijvoorbeeld:

/2009/05/16/een-beetje-natjes Karine De Smet
/2009/05/17/team-william-the-team-work Bert Moerman
/2009/05/18/multatuliteater-brengt-schitterende-pterodactylus Suzanne Vanderveken
/2009/05/19/reflectie-3 Erwin Lemmens
/2009/05/20/poort Marc Careel
/2009/05/21/amai Monique Callens
/2009/05/22/open-en-dicht Jan Van Brakel
/2009/05/23/hollandse-ouwe Jan Vens
/2009/05/24/25643 Ignace Van der Kelen
/2009/05/25/woerdwolken Erwin Lemmens
/2009/05/25/eentje-mee-hiel-veel-toepee Els Heyde
/2009/05/26/coupure Ignace Van der Kelen

Mha. WordPress-kant min of meer in orde, dus.

Nu aan de andere kant kijken wat en hoe. Ik zou kunnen auteurs in een CCK-veld steken, maar zou ik dat wel doen? Er kunnen meer auteurs per artikel zijn, en auteurs kunnen terugkomen. Ik denk dat ik ze in een taxonomie steek.

Eens kijken hoe dat databasegewijs in mekaar zit. Een “auteurs”-taxonomie bijgemaakt, en blijkbaar komt die terecht in een vocabulary-tabel, met per taxonomie-term een record in een term_data-tabel (taxonomy ID, term name), een bijkomend record in een term_hierarchy-tabel (term ID, parent ID — hier allemaal met parent=0, gemakkelijk).

Terms worden aan nodes gekoppeld in (surprise!) de term_node-tabel. Daar zit telkens een nid, vid en tid in: raar!

Want blijkt dat tid wel degelijk de term ID is, maar dat die nid (node ID) eigenlijk helemaal afhankelijk is van vid (revision ID, primary key van node_revisions), en dus dat die term_node niet 2NF is, ha.

…euh, maar bon. We kunnen dus de auteur koppelen aan een node. Ervan uitgaand dat het om een maagdelijk lege Drupal zal gaan, zal nid en vid altijd hetzelfde zijn net na die import, dat maakt het gemakkelijker.

En nu nog van een permalink naar een node geraken. De permalinks in Drupal zitten in de URL aliases, en URL aliases zitten in de (verrassing!) url_alias-tabel: de “WordPress-permalink” staat doodsimpelgaweg in url_alias.dst, en de Drupal-node ID staat als “node/####” in url_alias.src.

Bingo! Ik heb alles dat ik nodig heb!

*
*    *

Actieplan, bijzonder low tech want het gaat maar één keer gebeuren en ik heb geen zin om ook maar een letter te programmeren:

  1. Export van WordPress naar XML.
  2. Import in verse Drupal met WordPress Import.
  3. Lijst van auteurs uit WordPress halen: select distinct meta_value from wp_postmeta where meta_key='auteur' order by meta_value;
  4. Auteurs in Drupal in term_data steken: insert into term_data (vid, name) values (1,[auteur]); [auteur-vocabulary is 1 namelijk]
  5. Lijstje A: Drupal-auteurs met hun tid krijgen: select tid, name from term_data where vid=1;
  6. Lijstje B: Drupal-permalinks met node ID: select replace(src,'node/','') nid, dst permalink from url_alias where dst like '200%'; [alleen artikel-permalinks beginnen met 2004, 2005, etc.]
  7. Lijstje C: WordPress-permalinks met auteurs: select concat(date_format(post_date,'/%Y/%m/%d/'), post_name) permalink, meta_value auteur from wp_postmeta, wp_posts where wp_posts.id=post_id and meta_key='auteur' order by post_date;
  8. Lijstje B en lijstje C naast elkaar plakken, elke instantie van auteur in lijstje C vervangen door de overeenkomstige tid uit lijstje A. Misschien doe ik dat in Excel, misschien in MySQL, ik weet het nog niet. In ieder geval heb ik op het einde een lijstje D, met een nid (node ID in Drupal) en een tid (“auteur ID”, ttz. term ID voor die auteur in Drupal).
  9. Link tussen post en auteur leggen: insert into term_node (nid, vid, tid) values ([nid],[nid],[tid]);

Hey presto! Sounds like a plan!

En, euh, dat was dus stukken eenvoudiger dan dat ik dacht dat het zou zijn.

*
*    *

Nog te bekijken:

  • threaded comments
  • paginatemplates en content types, met onder meer foto van de dag, kalender, nieuws, uwged8

3 reacties op “WP > Drupal”

  1. Ah, schakelen we over? Of ben je gewoon aant prutsen?

    false edit: nevermind, het staat in de _allereerste_ paragraaf. Hallo, mijn naam is Tom en ik ben nog niet wakker.

  2. Je kan altijd meerdere auteurs aan 1 content type linken met de user_reference module die standaard bij CCK zit.

    Je gaat dan wel 1 hoofd auteur hebben van die node, maar met views en wat templating moffel je die zo weg.

Reacties zijn gesloten.