2016年8月28日 星期日

Blogger 無痛轉移至 WordPress 心得 (資料無痛,但工程師的頭很痛)

最近有位朋友(Hans543,下同)。有Blogger轉移至 WordPress的需求,由於目前市面上沒有現成的方案,因此找上我幫忙。我由於最近很閒(!),投稿又寫不出來(!),就答應幫個忙。

正確來說,網路相關的教學很多。但由於Hans經營blog 十幾年了,所以blogger轉匯出來的檔案很大...網路上沒有能夠處理這麼大的檔案的方法。

Hans當初會有這個需求是因為,他有許多文章在網路上廣為流傳連結也已加在許多其它文章裡,但Blogger自行修改了網址,造成這些網頁無法直接瀏覽。 例如:
http://hans543.com/2010/02/water-forest-water.html
但Blogger將之改為:
http://www.hans543.com/2010/02/water-forest-water.html

造成他原本的連結無法直接開啟。若開啟http://hans543.com/2010/02/water-forest-water.html,會被連到其首頁,而非該頁,這樣會對它的SEO點擊率的計算造成很大的影響。

後來他努力了很久,試了很多辦法,但沒有辦法徹底的決定,於是乎,他只好下定決心,將原來的Blogger搬家,轉移至自己租的網頁空間的WordPress ,將問題一勞永逸的解決。

老實說,我對blog系統真的一點都不熟,基於友情,只好想辦法從無到有一步一步的轉移。在此我整理一下大致的轉移流程及轉移的手法,讓有需求的網友可以參考。至於轉移過程中用到的程式就不方便一一提供了。下面的轉移過程看似輕鬆愉快,但實際上大概用了六天的時間才大致完成 (版面的調整我只有找到辦法,並請Hans自行調整)。

一、Blogger檔案的匯出與匯入WordPress:


由於Hans的檔案太大(超過20MB,十幾年的部落格真的不是開玩笑的),無法直接透過blogger importer的方式匯入,因此我們要先把它轉換成wordpress的格式,再使用wordpress的匯入程式將之匯入資料庫。原始程式google有人提供,但需在python 2.5的環境下才能執行,下面提供執行方法:

wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/google-blog-converters-appengine/google-blog-converters-r89.tar.gz  
tar xvzf google-blog-converters-r89.tar.gz sudo apt-add-repository  
sudo apt-get update  
apt-get install python2.5 
cd google-blog-converters-r89/  
vi blogger2wordpress.sh  
change python to python2.5 
./blogger2wordpress.sh blog-08-23-2016.xml_.txt > wordpress.xml  

附帶一提,轉出來的檔案也有14MB,但即使轉出來了,很多的東西 (例如分類),是要自己處理的。後續再談。我們試過的方法有:

1、切成小檔再一一匯入 (失敗,因為轉成小檔後,喪失了一些主要的格式:XML的相關標記)
2、線上轉檔網站(我猜測跟上面的那個程式是一樣的,它是網頁版。但他只提供2MB的轉檔)
3、其它轉檔套件(全部失敗)

在成功的轉換成wordpress的匯出格式後,我們再用wordpress預設安裝的plugin:wordpress將之啟動後成功匯入該檔,順利完成此需求。

(註: 你也可以使用blogger2movabletype.sh,將之轉為movabletype的匯出檔。但這個檔案不包含分類或標籤的資訊,如果你要手動補回去,你還是得回頭參考blogger的匯出檔)

二、靜態網頁的轉移:

由於Hans原先有一些網頁,例如:http://hans543.com/p/project-3650.html

希望在轉移後,也能透過轉址的方式使其能在不修改之前已發表的文章的連結繼續直接開啟。因此我們安裝了Redirection這個套件,並修改其設定,這個應該是所謂的301轉址。不會影響SEO。

 
我們把/p/project-3650.html ,轉換為project-3650,在wordpress修改該網頁的固定網址 (permalink)之後完成此需求。

三、所有文章的固定網址的修正:(再來幾乎都是硬幹修改資料庫的部份,如果你沒有這個基礎,請洽會寫程式的朋友或者找本人處理(當然是要報價的 ^_^)
這個也是花了很多時間,最後在修改文章永久網址時卡了很久在想到解法時才發現Hans早就想到了。不過由於一開始摸這個系統時不熟,因此在Hans先前跟我提及時,我沒有意到他提供的概念。

這個問題大概是這樣的:
在匯入wordpress後,文章的網址變為:
http://hans543.com/project-3650.d1564:摸蛤仔兼洗褲
但Hans原先的網址是長這樣的:
http://hans543.com/2016/08/project-3650-d1564-2.html

所以我們要做的事情有兩個:
1、修改資料庫
2、文章標題的修改

在資料表wp_postmeta,有我們需要的資料:
post_id:9
meta_key:blogger_permalink
meta_value: /2016/08/project-3650-d1560.html
我們將之取出,
資料如下:
 
接著我們回頭修改wp_post這張表,我們比對post_id,並修改其post_name的欄位的值為:project_3650-d1560 (要把meta_value作切割,取出最後一個字串)。wp_post存放的是所有發表過的文章 (甚至網頁連線記錄、草稿、放在回收筒的文章、上傳的照片的位址及說明)都放在這裡,是WordPress最重要的表。

最後我們回頭修改wordpress的固定網址的設定:(就是Hans一開始跟我提到的部份)
 
我們選擇自訂結構:%year%/%monthnum%/%postname%.html,接著儲存變更。這樣一來,這個需求就完成了。



四、Tag轉分類的處理:


這個過程也是很痛苦,痛苦的部份是... 其實我完成之後一直不曉得自己完成了,還一直在debug....這告訴我們,在作一件事時,最好是精神好一點再來處理。這個狀況說來好笑,就是那個預設的theme的所有分類會在右下角,而該文的分類在左上角。但我誤以為右下角的是該文分類...所以一直覺得奇怪,為何資料庫看起來是對的,但讀出來都是錯的 ><



tag轉分類的部份,同樣是寫程式處理。這裡要修改的資料表有三個:wp_terms、wp_term_taxonomy、wp_term_relationships。wp_terms:我們讀取轉出來的wordpress.xml,然後塞入wp_terms的name和slug 欄位,(slug要先轉成urlencode再轉成小寫後再存)。



做完會像這樣,term_id之後還會用到,slug的部份我當初是存成編碼後的結果,後來hans543自己修正成英文的了 (用軟體或網頁轉成成符合他想法的英文)


wordpress.xml需先處理,取出有category domain的字樣的行,然後再排序、刪掉重複的,再把html tag移除。

grep "category domain" wordpress.xml | sort > sort.txt
uniq sort.txt > uniq.txt
cat uniq.txt | awk '{print $2}' | awk -F">" '{print $2}' | awk -F"<" '{print $1}' > category.txt



最後再讀取category.txt,利用egrep和sed的方式取出其對應的分類,再塞回wp_terms,這邊的話都是一對一對關係。term_id是自動產生的,記得塞NULL就好。



接著要處理wp_term_taxonomy:

這邊我一開始處理錯了,後來發現這個表很簡單。只要塞term_id就好,term_taxonomy_id塞NULL,taxonomy塞category就好了,後面的count我有寫程式回補 (在處理
wp_term_relationships的時候弄的,但其實這個不是很重要,不補也對影響)




wp_term_relationships的處理:



這個才是這一段的關鍵,也是比較麻煩的地方。(事後看起來一點都不麻煩啊...我竟然在這種地方卡一天,真的要慎選theme....)


我們讀取post_id這張表,找到post_status是publish、然後post_type是post的,我們取出其ID和title,然後回頭讀category ,比較title的字串,找出對應的category domain,然後再去讀wp_term比較字串,取出其term_id,再用term_id去讀wp_term_taxonomy,取出其term_taxonomy_id,然後再一起塞回wp_term_relationships。要塞的有object_id (就是 wp_post的ID,term_taxonomy_id。這樣就好了。至於theme的部份,請選擇易於辨別的 XD ( 再次強調,因為我在這邊真的花了很多時間)

JetPack無法使用的解法:
JetPack是在WordExpress很著名的套件,但我們怎麼裝都無法與Wordpress的官方網頁連線。錯誤訊息如下:
 
 英文版的是這樣:

我試過的方法如下:




安裝Core-Control ,可以管理是否使用curl 改用http_request module來連(關閉curl),也可以查看http連線log。但無法排除問題。

 


1、跟網站名稱無關 (www有加沒有加都一樣)

2、使用core control關閉curl也一樣

3、使用jetpack lite來啟動也一樣

讓人好奇的是在安裝時就有錯誤訊息了。改採手動安裝試試。同樣無法解決。

最後是安裝了:Unplug Jetpack 似乎是解決了。但看起來功能有少一點。不過Hans說那些功能他多大用不到,所以pass。

另外JetPack額外提供CSS editor,很好用。在此給他一個讚。

另外Core-Control雖然沒有幫我解決問題,但它提供了log的儲存功能 (存在wp_post),是很實用的功能,可以用來除錯。(但缺點就是wp_post的資料數量變的很多),其擷圖如下:

  

後記:最近Hans把Unplug JetPack移除後,JetPack突然可以運作了。我懷疑是跟之前某些測試時安裝的plugin有衝突。

五、照片的匯入:
Hans希望把本來放在各地的圖片都改回放在目前的主機上。這個需求我本來以為很簡單,裝個Import External Images的plugin就解決了,誰知道,事情不是憨人如我所想的這麼簡單:
 
這個程式本身沒有什麼問題,它成功的匯入picasa和flickr之類的圖庫 (看到picasa就知道Hans的blog真的經營很久了)。但它無法讀取如googleusercontent和blogspot之類的照片,此外它一次只能大概讀250封貼文。所以要執行十幾次。但運作過程倒是沒有麼問題。

這個也只能自己寫程式來處理了。這邊我卡了很久..因為代管主機平台在debug不如我本機,再加上img src後面有一堆變數,有時有border,有時有alt,有時沒有border之類的),後來多次修改程式後才處理完成 (一共花了大概兩天的時間,不過很多時候是因為文章或圖太多,在下載圖片時,網路資源之類不足造成我需要等待),原先的文章大概有2300篇左右,我執行匯入程式時,大概是每次執行200~300篇的匯入,在匯入過程中我會一直看是否都有成功的更新資料庫 (要在wp_psot裡的post_content修改圖片的連結,在wp_post也要以新增附件的方式新增record)。這邊大概花四個小時以上執行匯入及比對,最後終於確認都有成功的匯入。之後再更改關鍵字(本來是取出googleusercontent,改成取出blogspot),就把blogspot的也成功的匯入。

六、字型更換為思源黑體:
 

Hans要把字體都換成Google的思源黑體,和我測試了幾次後發現在編輯CSS (在安裝JetPack後它提供的套件) ,新增以下字串就可以了:

@import  "http://fonts.googleapis.com/earlyaccess/notosanstc.css";

body {
    font-family: 'Noto Sans TC', sans-serif;
}

佈景主題(theme)更換後版型的調整及字型放大:
同樣是 在編輯CSS的地方加入以下的字串:
#primary {
    width: 860px;
    padding-right: 30px;
    padding-left: 30px;
    margin-left: -55px;
    margin-right: -50px;
}


#secondary {
    width: 360px;
    padding-right: 25px;
    padding-left: 25px;
    margin-left: 55px;
    margin-right: 55px;
}
 
這邊是Hans 辛苦試出來的。終於試到一個他滿意的,然後在各種瀏覽器和手機上都可以接受的排版。

七、theme(佈景主題)字型放大:
 

選擇外觀內的主題編輯器 (此例為easy-blog),找到以下的字串,在font-size修改為18px即可。

body {
    font-family: 'Roboto', sans-serif;
    background: #f3f4f6;
    font-size: 18px;
    line-height: 1.8em;
    letter-spacing: 0.01em;
    color: rgba(39,48,57,.8);
}

八、令人膽顫心驚的-2問題的排除:(固址位址自動附加-2)
這個問題很有趣,Hans發現發新文後,會在網頁的固定位址加上-2,例如網址會變成:
http://hans543.com/2016/08/project-3650-d1560-2.html
我原本是安裝了Permalink Manager這個套件,讓Hans擋著用先 (發文完後再手動去修改其固定位址,算是一個short solution)
後來圖片搬完後,Hans希望我幫忙看一下。我就手動亂設定了一下,結果就完蛋了...
固定網址都跑掉了(變成預設的模式,有中文網址的那個),但我看資料庫和這個plugin都沒有設定檔有異動,只好把它移掉。之後再測試時更把所有的post_name都異動掉了 (請參考之前固定網址的處理)..還好我有備份,資料庫倒回就好。

下午繼續測試,找到了正確的設定方式,即使在Permalink Manager有進行修改。也可以順利的復原。但我還是解決不掉Hans的問題。網路上的人都說,一定是附檔有重覆檔名(在後來的WordPress版本已修正),或者在草稿裡有重覆檔名,但我認為沒有。

最後死心回頭找DB,發現...檔名的確是重覆了....XD
這邊大概花了六個小時以上的時間 .....

九、繼續閱讀問題的修正:(!--more)

Hans本來在發文中都很貼心的加上:(如果看不到的話,它寫的是繼續閱讀,就是當網頁過長時的對應方式)
這個HTML tag,但轉檔匯入後變成:

這個不難處理,直接寫程式更新wp_post裡面的post_content就可以了。如果你MySQL的語法很熟,用MySQL的REPLACE語法,應該可以一致解決。我MySQL不算熟,因此我試了十幾分鐘後回頭鼻子摸一摸寫程式去改資料庫。


、選擇外觀(theme)中的自訂時會要不斷要你登入的問題:
 

 這個爬文就有,是一般設定中,WordPess 位址與網站位址不同的關係。


心得:
轉移的過程中,其實遇到很多問題。許多就順手排除了,因此沒有一一記錄到。最後感謝Hans給我這個學習的機會,在轉移的過程中著實受益斐淺,又學會了新的東西。 :)







2 則留言:

  1. 超級大感謝!!!
    你真是太神啦!(跪地膜拜)
    非常謝謝你的協助,搬家才有辦法順利完成!
    若是大家有這方面的需求,強力推薦大家找日光燈大神幫忙唷 :)

    回覆刪除
    回覆
    1. 哈哈哈,好說。不過我老婆最近跟我說,還好我當初沒有選擇當RD,不然我每天弄到三更半夜,身體應該早就垮了 XD

      刪除