MovableType 4 轉 Wordpress 2.6

記錄一下由 MovableType 轉換至 WordPress 的東西。 其實要從 MT 轉換到 WordPress 還滿簡單的, 只要從 MT 匯出, 在從 WordPress 匯入即可, 不過要顧及 SEO 的部份, 不讓原有的網址失效, 就得花點工夫來處理。

在 MT 的匯出檔案中, 並沒有帶著每篇文章的 post id。 而匯入到 WordPress 之後的 post id, 則是累加上去的, 所以在轉換、匯入到 WordPress 之後, 無法根據文章的 post id 來做 url rewire, 把舊的網址給轉到新的網址。 這麼一來, 舊的網址就會失效, 原本的 page rank 也可以能隨之下降。

所以這裡要來記錄, 如何在轉換之後, 能夠讓原本的網址連至新的網頁。 所以大多都是在針對 post id 的處理, 我們可以根據 post id, 來對應新舊文章。本篇文章以 MT 4.1 轉換至 WordPress 2.6.5 為範例。

在開始之前, 請先試著把 MT 匯出的檔案匯入到 WordPress, 看看是否能夠順利匯入, 因為在匯入的時候, 發現到, 如果有重覆的文章標題 (title), 則無法正常進行匯入。 碰到重覆的文章標題時, php 會 time out。 如果有重覆標題時, 請把重覆的標題改掉。 當匯入正常時, 再進行以下步驟。

  1. 首先, 因為 MT 在匯出檔案時, 是不會有 post id 的, 所以必須修改匯出的程式, 讓他可以匯出 post id。可以修改下面這個檔案:

cgi-bin/lib/MT/ImportExport.pm

找到約 480 行, 應該可以看到如下的程式碼:

## Create template for exporting a single entry
require MT::Template;  
require MT::Template::Context;  
my $tmpl = MT::Template->new;  
$tmpl->name('Export Template');
$tmpl->text(<<'TEXT');
AUTHOR: <$MTEntryAuthor strip_linefeeds="1"$>  
TITLE: <$MTEntryTitle strip_linefeeds="1"$>  
BASENAME: <$MTEntryBasename$>  
STATUS: <$MTEntryStatus strip_linefeeds="1"$>  
ALLOW COMMENTS: <$MTEntryFlag flag="allow_comments"$>  
CONVERT BREAKS: <$MTEntryFlag flag="convert_breaks"$>  
ALLOW PINGS: <$MTEntryFlag flag="allow_pings"$>  
PRIMARY CATEGORY: <$MTEntryCategory$>  
CATEGORY: <$MTCategoryLabel$>  
DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$>  
<span style="color:red">POSTID: <$MTEntryID$></span>  
TAGS: <$MTTagName quote="1"$><hr></hr><p>BODY:  
<$MTEntryBody convert_breaks="0"$>  
-----</p>```

在這裡, 只要加上紅色那一行, 即可讓 MT 在匯出時帶有 post id。

1. 在可以匯出有 post id 的檔案之後, 接下來就是要修改 WordPress 匯入的部份, 讓 WordPress 可以讀取檔案中的 post id。 首先修改下面這個檔案:

> wp-admin/import/mt.php

找到約 330 行左右, 可以看到如下的程式碼:
        } else if ( 0 === strpos($line, "TITLE:") ) {
            $title = trim( substr($line, strlen("TITLE:")) );
            if ( '' == $context )
                $post->post_title = $title;
            else if ( 'ping' == $context )
                $ping->title = $title;
        <span style="color:red">} else if ( 0 === strpos($line, "POSTID:") ) {
            $post_id = trim( substr($line, strlen("POSTID:")) );
            $post->post_id = $post_id;</span>
        } else if ( 0 === strpos($line, "STATUS:") ) {```

只需要加上紅色那三行, 即可讀取到 post id。

  1. 接下來則是修改寫入資料庫的部份, 修改下面這個檔案:

wp-include/post.php

約在 1296 行左右, 可以看到程式碼如下:

    if ( 'draft' != $post_status ) {
    ...略...
    }

    <span style="color:red">$post_ID = (int) $post_id;
    $ID = (int) $post_id;</span>

    // expected_slashed (everything!)
    ...```

只需要加上紅色那兩行即可。 將我們所讀取到的 post id, 覆寫到要寫入資料庫的變數, 這麼一來, 之後匯入到 WordPress 的 post id , 就會跟 MT 的 post id 相同, 我們就可以根據這個 post id 來對應新舊文章了!

1. 接著就開始匯入啦! 當然得先把資料庫清空囉。  
2. 最後, 在匯入 WordPress 完畢後, 可以在 .htaccess 加上 url rewrite 如下:  
 PS. WordPress 的 permalink 是選用 Numeric 的形式。


RewriteEngine On
RewriteBase /
RewriteRule ^archives/([0-9]{6}).php$ archives/$1 [R=301,L]
RewriteRule ^archives/(200[0-9])_([0-9]{1,2}).php$ archives/date/$1/$2 [R=301,L]
RewriteRule ^cgi-bin/mt-search.cgi?tag=([^&]+).*$ archives/tag/$1 [R=301,L]
RewriteRule ^atom.xml$ feed/atom [R=301,L]
RewriteRule ^rss.xml$ feed [R=301,L]

RewriteCond %{REQUESTFILENAME} !-f
RewriteCond %{REQUEST
FILENAME} !-d
RewriteRule . /index.php [L]
```

差不多就是這樣吧!

喔! 對了, 匯入成功之後, 記得把 wp-include/post.php 改回來嘿。

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!