Jak na přesun z Drupalu na WordPress?

Na BCVlogu jsme používali Drupal, ale v rámci s jednocování platformy jsme se rozhodli k přesunu na WordPress. Postup je relativně snadný.

Podle článků

jsem provedl konverzi dat SQL dotazama. Jen jsem si trošku musel SQL upravit. Celou sadu SQL dotazů sem přikládám – použití je snadné, připojil jsem se jako uživatel s oprávněním na DB drupalu (drupaldb) i wordpressu k wordpress databázi a copy-paste stylem jsem spustil:

TRUNCATE TABLE wp_comments;
TRUNCATE TABLE wp_links;
TRUNCATE TABLE wp_postmeta;
TRUNCATE TABLE wp_posts;
TRUNCATE TABLE wp_term_relationships;
TRUNCATE TABLE wp_term_taxonomy;
TRUNCATE TABLE wp_terms;
TRUNCATE TABLE wp_users;
TRUNCATE TABLE wp_usermeta;
INSERT INTO wp_terms (term_id, `name`, slug, term_group)
SELECT d.tid, d.name, REPLACE(LOWER(d.name), ' ', '_'),
FROM `drupaldb`.term_data dINNER JOIN `drupaldb`.term_hierarchy hUSING(tid);

INSERT INTO wp_term_taxonomy (term_id, taxonomy, description, parent)
SELECT d.tid `term_id`, 'category' `taxonomy`,
 d.description `description`, h.parent `parent`
FROM `drupaldb`.term_data d
INNER JOIN `drupaldb`.term_hierarchy hUSING(tid);
INSERT INTO wp_posts (id, post_author, post_date,
post_content, post_title, post_excerpt, post_name,
post_modified, post_type, `post_status`)
SELECT DISTINCT n.nid `id`, n.uid `post_author`,
FROM_UNIXTIME(n.created) `post_date`, r.body `post_content`,
 n.title `post_title`, r.teaser `post_excerpt`,
 IF(SUBSTR(a.dst, 11, 1) = '/', SUBSTR(a.dst, 12), a.dst) `post_name`,
FROM_UNIXTIME(n.changed) `post_modified`, n.TYPE `post_type`,
 IF(n.STATUS = 1, 'publish', 'private') `post_status`
FROM `drupaldb`.node n
INNER JOIN `drupaldb`.node_revisions r
USING(vid)
LEFT OUTER JOIN `drupaldb`.url_alias a
ON a.src = CONCAT('node/', n.nid)
WHERE n.TYPE IN ('post', 'page', 'article','blog')
GROUP BY `id`;
UPDATE wp_posts SET post_type='post' 
WHERE post_type='article';
UPDATE wp_posts SET post_type='post'
WHERE post_type='blog';
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id)
SELECT nid, tid
FROM `drupaldb`.term_node
GROUP BY `nid`,`tid`;
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);
INSERT INTO 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 `drupaldb`.comments;
UPDATE `wp_posts` 
SET `comment_count` = (SELECT COUNT(`comment_post_id`)
FROM `wp_comments` WHERE `wp_posts`.`id` = `wp_comments`.`comment_post_id`);
UPDATE wp_posts 
SET post_content = REPLACE(post_content, '', '');
UPDATE wp_posts 
SET post_content = REPLACE(post_content, '"/files/', '"/wp-content/uploads/');
INSERT IGNORE INTO wp_users(ID, user_login, user_pass,
user_nicename, name, user_registered, user_activation_key,
user_status, display_name)
SELECT DISTINCT u.uid, u.name, "$P$BVJsckmkmcwe1aqdyAweftbOOt.",
u.name, u.mail,FROM_UNIXTIME(created), '', 0, u.name
FROM `drupaldb`.users u;
INSERT IGNORE INTO wp_usermeta (user_id, meta_key, meta_value)    
SELECT DISTINCT u.uid, 'wp_capabilities', 'a:1:{s:6:"author";s:1:"1";}'   
FROM `drupaldb`.users u
INNER JOIN `drupaldb`.users_roles r
USING (uid);
# Change permissions for admins.
# Add any specific user IDs to IN list to make them administrators.
# User ID values are carried over from Drupal.
UPDATE wp_usermeta   
SET meta_value = 'a:1:{s:13:"administrator";s:1:"1";}'   
WHERE user_id IN (1,3) AND meta_key = 'wp_capabilities';
UPDATE wp_usermeta   
SET meta_value = '10'   
WHERE user_id IN (1) AND meta_key = 'wp_user_level';
UPDATE wp_posts 
SET post_author = NULL
WHERE post_author NOT IN (SELECT DISTINCT ID FROM wp_users);

Škody způsobené přenosem

  • Přenosem dat jsme přišli u všech uživatelů o hesla – Drupal a WordPress používají rozdílný formát uložených hesel. Nevím jestli je možná konverze, ve firmě je nás málo tak si každý změní heslo.
  • V některých zápiscích jsme v Drupalu používali img_assist pro vkládání obrázků, po přenosu zápisků do WordPressu se samozřejmě obrázky nevkládají. Oprava bude asi ruční.
  • Na titulní stránce a v seznamu článků (kategorie, archiv) se zobrazují celé články, když edituji a rozdělím článek, tak se zobrazí správně. V Drupalu byly články rozdělené pomocí značky <!-break–>

Přínosy přenosu

  • Při přenosu jsem pročistil tagy a zavedl pár kategorií. Skoro každý autor si tagy v Drupalu vyplňoval náhodně a byl v tom nepěkný bordel.
  • Máme sjednocené prostředí – používáme pouze WordPress
  • Začala mi správně fungovat publikace textu z “tlustého” klienta MarsEdit 🙂

Jinak se zdá, že přenos byl úspěšný, web běží na WordPressu a vše funguje jak má.