Under påskhelgen som var så utförde jag en flytt, eller migrering, från Drupal till WordPress. Innan flytten funderade jag mycket kring hur svårt det skulle vara, om det ens var möjligt. Med facit i hand så var det enklare än förväntat. Tänkte därför berätta lite kort om detta, om fler vill göra detsamma.
Varför ska man då flytta från Drupal till WordPress?
Drupal är ett riktigt bra CMS. Den har en stor användarbas med många olika tillägg och teman. Personligen har jag dock större kunskap om WordPress och detta var en Drupal 6-sida som hade behövt uppgraderas till Drupal 7, vilket är ett rätt så stort projekt i sig. Därav denna migrering.
Flytten skedde mellan Drupal 6.2.6 och WordPress 3.5.1. Dessa instruktioner kan fungera med andra versioner av Drupal och WordPress, men det kan inte garanteras (t ex pga förändrad tabellstruktur, ändrade fältnamn osv). Som alltid, när man gör sådana här saker, se till att du har ordentlig backup på allt.
Så flyttar man från Drupal till WordPress
1. Börja med att exportera den fullständiga databasen för Drupal-sidan och ladda ner den till din dator. Det gör man enklast via t ex phpMyAdmin och dess exportfunktion (kör bara en standardexport). Om det är en stor Drupal-sida så kan det här ta en stund.
2. Installera sedan den nya WordPress-sidan. Om du har ett webbhotellspaket hos FS Data så kan du följa dessa enkla instruktioner: FS Data manualer, Installera WordPress på ditt webbhotell.
3. Skapa därefter ytterligare en MySQL-databas. Det är till denna databas som vi ska importera den tidigare exporterade databasen från Drupal. Instruktioner för hur man skapar en databas hos FS Data finns här: FS Data manualer, Skapa MySQL-databas.
4. Nu är det dags att importera den tidigare exporterade databasen. Om databasexporten är större än 25 MB så bör man använda en fristående MySQL-klient istället för phpMyAdmin. Jag använder Mac OS X och kan rekommendera den kostnadsfria MySQL-klienten Sequel Pro. Anslut mot den nyligen skapade (och tomma) MySQL-databasen och importera den exporterade Drupal-databasen. Detta kan likaså ta en stund att genomföra.
5. När importen är klar så är det dags att köra ett antal SQL-kommandon. Dessa kommandon är anpassade för en WordPress-databas med namnet ”u1234567_a” och en (importerad) Drupal-databas med namnet ”u1234567_d”, så man behöver givetvis anpassa detta efter namnen på sina motsvarande databaser. Förslagsvis att man använder en separat MySQL-klient även för att köra dessa SQL-kommandon.
Vi börjar med att rensa WordPress-databasen från de inlägg/kommentarer som ingår i en ny WordPress-installation.
TRUNCATE TABLE u1234567_a.wp_comments;
TRUNCATE TABLE u1234567_a.wp_links;
TRUNCATE TABLE u1234567_a.wp_postmeta;
TRUNCATE TABLE u1234567_a.wp_posts;
TRUNCATE TABLE u1234567_a.wp_term_relationships;
TRUNCATE TABLE u1234567_a.wp_term_taxonomy;
TRUNCATE TABLE u1234567_a.wp_terms;
Därefter är det dags att importera lite kategorier från Drupal-databasen till WordPress-databasen. Notera att WordPress kräver unika kategorinamn, till skillnad från Drupal. Om du har flera kategorier med samma namn i Drupal så behöver dessa döpas om innan importen.
INSERT INTO u1234567_a.wp_terms (term_id, `name`, slug, term_group)
SELECT
d.tid, d.name, REPLACE(LOWER(d.name), ' ', '-'), 0
FROM u1234567_d.term_data d
INNER JOIN u1234567_d.term_hierarchy h
USING(tid)
;
INSERT INTO u1234567_a.wp_term_taxonomy (term_id, taxonomy, description, parent)
SELECT
d.tid `term_id`,
'category' `taxonomy`,
d.description `description`,
h.parent `parent`
FROM u1234567_d.term_data d
INNER JOIN u1234567_d.term_hierarchy h
USING(tid)
;
Sedan importerar vi alla sidor från Drupal-databasen till WordPress-databasen.
INSERT INTO
u1234567_a.wp_posts (id, post_date, post_content, post_title,
post_excerpt, post_name, post_modified)
SELECT DISTINCT
n.nid, FROM_UNIXTIME(created), body, n.title,
teaser,
REPLACE(REPLACE(REPLACE(REPLACE(LOWER(n.title),' ', '-'),'.', '-'),',', '-'),'+', '-'),
FROM_UNIXTIME(changed)
FROM u1234567_d.node n, u1234567_d.node_revisions r
WHERE n.vid = r.vid
Samt kopplar dessa inlägg/sidor till rätt kategorier.
INSERT INTO u1234567_a.wp_term_relationships (object_id, term_taxonomy_id)
SELECT nid, tid FROM u1234567_d.term_node;
UPDATE wp_term_taxonomy tt
SET `count` = (
SELECT COUNT(tr.object_id)
FROM wp_term_relationships tr
WHERE tr.term_taxonomy_id = tt.term_taxonomy_id
);
Vi importerar även kommentarer och döljer eventuella dolda kommentarer.
INSERT INTO u1234567_a.wp_comments (comment_post_ID, comment_date, comment_content, comment_parent, comment_author, comment_author_email, comment_author_url, comment_approved)
SELECT nid, FROM_UNIXTIME(timestamp), comment, thread, name, mail, homepage, status FROM u1234567_d.comments;
UPDATE `wp_posts` SET `comment_count` = (SELECT COUNT(`comment_post_id`) FROM `wp_comments` WHERE `wp_posts`.`id` = `wp_comments`.`comment_post_id`);
Sedan ordnar vi lite radbrytningar i de importerade inläggen/sidorna.
UPDATE u1234567_a.wp_posts SET post_content = REPLACE(post_content, '', '');
För att till sist ändra sökvägen till samtliga bilder för våra importerade inlägg/sidor.
UPDATE u1234567_a.wp_posts SET post_content = REPLACE(post_content, '"/sites/default/files/', '"/wp-content/uploads/sites/8old/');
UPDATE u1234567_a.wp_posts SET post_content = REPLACE(post_content, 'http://www.exempel.se/sites/default/files/', '/wp-content/uploads/sites/8old/');
Ersätt http://www.exempel.se ovan med adressen till den tidigare Drupal-sidan. Sökvägen till filerna i Drupal kan även behöva anpassas. Sedan är vi klara med våra SQL-kommandon.
Om man vill importera de tidigare användarna från Drupal-databasen till WordPress-databasen så kan man följa instruktionerna i slutet av detta blogginlägg: Migration from Drupal to WordPress. I mitt fall så gjorde jag inte det, utan samtliga inlägg/sidor kopplades till min enda WordPress-användare (som skapades när jag installerade WordPress).
6. Några saker kvarstår innan vi är helt klara med flytten. Först så behöver vi hämta samtliga bilder från Drupal-sidan och lägga upp dem i WordPress. Det gör man genom att logga in mot den gamla Drupal-sidan via FTP/SFTP och hämta ner samtliga bilder under /sites/default/files/ (standardsökvägen för Drupal-sidor, kan behöva anpassas). Dessa laddar man sedan upp mot den nya WordPress-sidan under /wp-content/uploads/sites/8old/ (skapa old-mappen). Detta innebär dock att bilderna inte hamnar i WordPress inbyggda mediahantering.
7. När vi importerade sidorna från Drupal, med ovan angivna SQL-kommandon, så skapades de som inlägg i WordPress. Om man vill att de istället ska vara sidor i WordPress så kan man installera/aktivera följande WordPress-tillägg: Post Type Switcher. Med det tillägget installerat så är det bara att redigera valfritt inlägg och ändra ”Post Type” till Page för att ändra inlägget till en vanlig sida.
Mycket svårare än så här är det inte att flytta en sida från Drupal till WordPress.
Utöver ovanstående saker så behöver man givetvis ställa in permalänkarna på din nya WordPress-sida, skapa användare, välja ett tema och strukturera upp sina sidor/inlägg osv. För en normalstor sida tar det inte mer än någon timme eller två. Därefter är det WordPress för hela slanten som gäller!
Lämna gärna en kommentar om du har några frågor eller om du flyttar från Drupal till WordPress med denna guide.