最早期使用的 Blog 系統是 MT (Movable Type), 後來使用 pLog (LifeType), MT 系統要維護還蠻麻煩的(Spam 太多), 於是趁這次將全部文章都統一倒進 WordPress 裡面, 一併解決.
此轉換需要做下述準備:
- Export MT 文章 (用系統本身的 Export 功能即可), Export 格式可參考: The Movable Type Import / Export Format
- Export LifeType 文章 (可見: LifeType 透過 RSS Dump 所有文章 - 這個不一定會用到, 可以先不準備此步驟)
- 解決圖片、檔案對應 (網址 Rewrite)
- 解決網址對應的 Rewrite (Category, Article)
- MT 網址格式: /archives/000590.html
- LifeType 網址格式: /my_note-unix/2011/03/18/build-git-env-share-over-ssh-2011
MT 與 LifeType 版本
- MT 版本: 2.x
- LifeType 版本: lifetype-1.2.11_r7114
MT + LifeType 轉換到 WordPress 的步驟
安裝 WordPress 與 相關外掛
首先先安裝好 WordPress 3.1 版, 並安裝下述外掛:
- Movable Type and TypePad Importer
- RSS Importer - 若沒有需要用 RSS 匯入, 就不用安裝.
MT 資料匯入
將 WordPress 預設 DB 的資料清空, 進入 MySQL 的 WordPress DB.
- mysql -u root wordpress
- truncate table wp_terms;
- truncate table wp_comments;
- truncate table wp_posts;
- truncate table wp_term_taxonomy;
- truncate table wp_term_relationships;
- 將 MT.dump 資料先 Feed 進 DB. (使用 Movable Type and TypePad Importer 的外掛)
計算 MT 的文章、意見和分類等 數量
- select MAX(ID) from wp_posts; // 593筆
- select MAX(comment_ID) from wp_comments; // 104筆
- select MAX(term_id) from wp_terms; // 12筆
- select * from wp_term_relationships; // object_id = ID, term_taxonomy_id, 592筆 (max object_id = 593)
- select MAX(term_taxonomy_id), term_id from wp_term_taxonomy; // term_taxonomy_id (1~12) = term_id, 12筆
- 註: wp_term_relationships 是 文章與 Category 的對應關係
LifeType 資料匯入 與 處理
在此時, 請另外安裝一套新的 WordPress、DB (因為需要先將資料匯入, 做完處理才可以做整合的動作)
LifeType 資料匯入 WordPress
若使用 RSS 匯入, 檔案太大可修改下述: (RSS 匯入的話, 文章的意見都不會匯入) - 若不是請跳過此步驟.
- vim /etc/php5/apache2/php.ini
upload_max_filesize = 2M # 改成 20M - /etc/init.d/apache2 reload
將 LifeType 由 DB(下述 LifeType 的 DB name 是 "plog") 直接匯入 WordPress (若只要做 LifeType 轉進 WordPress, 依照此步驟即可)
- mysql -u root wordpress
- truncate table wp_terms;
- truncate table wp_comments;
- truncate table wp_posts;
- truncate table wp_term_taxonomy;
- truncate table wp_term_relationships;
- INSERT INTO wp_terms ( term_id, name, slug ) SELECT id, name, mangled_name FROM plog.plog_articles_categories;
- INSERT INTO wp_comments (comment_ID, comment_post_ID, comment_content, comment_date, comment_date_gmt, comment_author_email, comment_author_url, comment_author, comment_author_IP) SELECT id, article_id, normalized_text, DATE, DATE + INTERVAL - 16 HOUR, user_email, user_url, user_name, client_ip FROM plog.plog_articles_comments;
- #INSERT INTO wp_posts (ID, post_author, post_date, post_date_gmt, post_modified, post_modified_gmt, comment_count) SELECT id, 1, DATE, DATE + INTERVAL - 16 HOUR, DATE, DATE + INTERVAL - 16 HOUR, num_comments FROM plog.plog_articles
- INSERT INTO wp_posts (ID, post_author, post_name, post_date, post_date_gmt, post_modified, post_modified_gmt, comment_count) SELECT id, 1, slug, DATE, DATE + INTERVAL - 16 HOUR, DATE, DATE + INTERVAL - 16 HOUR, num_comments FROM plog.plog_articles;
- UPDATE wp_posts, plog.plog_articles_text SET wp_posts.post_title = plog.plog_articles_text.topic WHERE wp_posts.ID = plog.plog_articles_text.article_id;
UPDATE wp_posts, plog.plog_articles_text SET wp_posts.post_content = plog.plog_articles_text.TEXT WHERE wp_posts.ID = plog.plog_articles_text.article_id;
UPDATE wp_posts SET wp_posts.guid=CONCAT( "https://blog.longwin.com.tw/?p=" , wp_posts.ID) WHERE wp_posts.guid = ""; - UPDATE wp_posts SET post_content=REPLACE(post_content,'[@more@]',"<!--more-->"); # 將文章內的"繼續閱讀" 轉換成 WP 的格式
- INSERT INTO wp_term_taxonomy ( term_taxonomy_id, term_id) SELECT id, id FROM plog.plog_articles_categories;
- INSERT INTO wp_term_relationships ( object_id, term_taxonomy_id ) SELECT article_id, category_id FROM plog.plog_article_categories_link;
- UPDATE wp_term_taxonomy SET count = ( SELECT count(*) FROM plog.plog_article_categories_link WHERE plog.plog_article_categories_link.category_id=wp_term_taxonomy.term_id );
- UPDATE wp_term_taxonomy SET taxonomy = 'category';
- 若是只要做 LifeType 轉進 WordPress 的話, 到此步驟就已經完成了.
處理 LifeType 資料, 準備整合 MT
摘要, 需要處理下述 Table, 並加上 MT 相對應得值.
wp_comments:
- comment_ID: comment_ID + mt 意見數量 (104)
- comment_post_ID: comment_post_ID + mt 文章數量 (593)
wp_posts:
- ID + mt 文章數量 (593)
wp_terms:
- term_id + mt 分類數量 (12)
wp_term_relationships:
- object_id + mt 文章數量 (593)
- term_taxonomy_id + mt 分類數量 (12)
wp_term_taxonomy:
- term_taxonomy_id + mt 分類數量 (12)
- term_id + mt 分類數量 (12)
執行上述摘要, 因為要作加法的動作, 會造成 Primary key 重複, 所以先要拿掉 Primary Key 和 auto_increment.
- 拿掉 Primary Key 和 auto_increment
- alter table wp_comments modify comment_ID bigint(20) unsigned;
- alter table wp_comments drop primary key;
- alter table wp_terms modify term_id bigint(20) unsigned;
- alter table wp_terms drop primary key;
- alter table wp_term_relationships drop primary key;
- alter table wp_term_taxonomy modify term_taxonomy_id bigint(20) unsigned;
- alter table wp_term_taxonomy drop primary key;
- alter table wp_term_taxonomy drop key `term_id_taxonomy`;
- alter table wp_posts modify ID bigint(20) unsigned;
- alter table wp_posts drop primary key;
- 執行增加編號的動作
- UPDATE wp_comments SET comment_ID = comment_ID + 104, comment_post_ID = comment_post_ID + 593;
- UPDATE wp_terms SET term_id = term_id + 12;
- UPDATE wp_term_relationships SET term_taxonomy_id = term_taxonomy_id + 12, object_id = object_id + 593;
- UPDATE wp_term_taxonomy SET term_taxonomy_id = term_taxonomy_id + 12, term_id = term_id + 12;
- UPDATE wp_posts SET ID = ID + 593;
- UPDATE wp_posts SET wp_posts.guid=CONCAT( "https://blog.longwin.com.tw/?p=" , wp_posts.ID);
- 將此 WordPress 的 DB 資料 Dump 出來, 只需要"資料".
- mysqldump -u root tmp_wordpress | grep 'INSERT' > lifetype-wp.sql
將 LifeType 資料寫入已經有 MT 資料的 DB
- mysql -u root wordpress < lifetype-wp.sql
Apache 設定網址永久轉換
到此, 已經將 MT + LifeType 的資料, 全部都整合進 WordPress 的系統裡面了.
再來就是要作 Apache Rewrite 的動作 (將舊的網址, 做 301 Redirect 到新的網址)
- MT 網址格式: /archives/000590.html
- LifeType 網址格式: /my_note-unix/2011/03/18/build-git-env-share-over-ssh-2011
- WordPress 網址格式: /2005/04/css-html-%E7%B7%A8%E7%A2%BC%E5%95%8F%E9%A1%8C/ (這是我挑選的)
- 註: WordPress 對應網址, 會是 post_name + post_modified (post_modified_gmt 不會用到)
寫了兩隻簡單的 Script 來產生 Rewrite 的資料, 在自行將這些資料寫入 .htaccess 或 Apache 裡面即可.
MT 部份 (mt_rewrite.php)
LifeType 部份 (lifetype_rewrite.php)
註: 分類、檔案、圖片對應, 手動加 Rewrite 即可.
關於 Apache rewrite 的說明
- 下述摘錄自: mod_rewrite - Apache HTTP Server # 下述特別摘錄對於網址列有 % 要如何處理. (\% + [R,NE])
'noescape|NE' (no URI escaping of output)
This flag prevents mod_rewrite from applying the usual URI escaping rules to the result of a rewrite. Ordinarily, special characters (such as '%', '$', ';', and so on) will be escaped into their hexcode equivalents ('%25', '%24', and '%3B', respectively); this flag prevents this from happening. This allows percent symbols to appear in the output, as inRewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
which would turn '/foo/zed' into a safe request for '/bar?arg=P1=zed'.