読者です 読者をやめる 読者になる 読者になる

S.F. Page

Programming,Music,etc...

Wordpressからはてなブログへ移行した。

移行した

そういうわけで昨日下記のスクリプトをnode.jsで作り、WordpressデータをMT形式でエクスポートし、はてなブログにインポートした。記事数は3000ちょっとであるがインポートにはかなりの時間を要した。 記事中の自ブログへのURL等もそれなりに変換してエクスポートしている。

/*
   WordpressのデータベースからMT形式のエクスポートファイルを生成する。
 */


var fs = require('fs');
var Q = require('q');
var dbj = fs.readFileSync('dbinfo.json', 'utf-8');
var dbinfo = JSON.parse(dbj);

var mysql = require('mysql');

//mysqlクライアント作成
var mySQLConn = mysql.createConnection({
    user: dbinfo.user,
    password: dbinfo.password,
    database: dbinfo.db
});

// mysql.mySQLQuery メソッドをプロミスを返すバージョンに変換
var mySQLQuery = Q.nbind(mySQLConn.query, mySQLConn);
//var writelog = fs.createWriteStream('./log.txt');

var categoryQuery = 'select wp_terms.name,wp_terms.slug from wp_term_relationships left join wp_term_taxonomy on wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id left join wp_terms on wp_term_taxonomy.term_id = wp_terms.term_id where wp_term_relationships.object_id = ';

var sepI = '-----\n';
var sepR = '--------\n';

/// ブログコンテンツの生成
function createMTExportFile() {
    var defer = Q.defer();
    mySQLQuery('select wp_posts.*,wp_users.display_name as user_name from wp_posts left join wp_users on wp_posts.post_author = wp_users.id where post_status in ("publish","draft") order by post_date desc')
    .then(function (params) {
        var result = params[0];
        console.log('createMTExportFile start');
        var i = 0;
        var contStr = '';
        function loop() {
            var r = result[i];

            // カテゴリ情報の取得
            mySQLQuery(categoryQuery + r.ID)
            .then(function (p) {
                var categoryRecords = p[0];
                contStr += 'TITLE: ' + r.post_title + '\n';
                contStr += 'BASENAME: ' + decodeURI(r.post_name) + '\n';
                contStr += 'STATUS: ' + r.post_status + '\n';
                contStr += 'ALLOW COMMENTS: 0 \n';
                contStr += 'CONVERT BREAKS: 0 \n';
                var dt = r.post_date;
                contStr += 'DATE: ' + ('0' + (dt.getMonth() + 1)).slice(-2) + '/' + ('0' + (dt.getDate() + 1)).slice(-2) + '/' + dt.getFullYear() + ' '
                    + ('0' + dt.getHours()).slice(-2) + ':' + ('0' + dt.getMinutes()).slice(-2) + ':' + ('0' + dt.getSeconds()).slice(-2) + '\n';

                if (categoryRecords.length > 0) {
                    for (var idx = 0, end = categoryRecords.length; idx < end; ++idx) {
                        contStr += 'CATEGORY: ' + categoryRecords[idx].name + '\n';
                    }
                }

                contStr += sepI;
                contStr += 'BODY: \n';
                
                var postContent = r.post_content;
                postContent = postContent
                    .replace('/blog/wp-content/uploads/', '/content/')
                    .replace(/[\"\']http\:\/\/[^\"]*\/blog\/[^\"]*\/([^\/\"]*)\/[\"\']/igm, '"http://sfpgmr.hatenablog.jp/entry/$1"')
                    .replace(/[\"\']http\:\/\/[^\"]*\/blog\/([^\"\/]*)\/[\"\']/igm,'"http://sfpgmr.hatenablog.jp/entry/$1"')
                    .replace(/(\[amazon_vcitem[^/]*\/amazon_vcitem?\])/igm, '<!-- $1 -->');


                contStr += postContent + '\n';
                contStr += sepI;
                contStr += sepR;
            }).done(function () {
                ++i;
                if (i < result.length) {
                    loop();
                } else {
                    defer.resolve(contStr);
                    //client.end();
                }
            }, function (err) { console.log(err);defer.reject(err); });
        };
        loop();
    });
    return defer.promise;
}

Q(createMTExportFile())
.then(function (MTStr) {
    return Q.nfcall(fs.writeFile, 'mt.txt',MTStr);
}).then(function () {
    mySQLConn.end();
}).catch(function (err) {
    // エラー終了
    mySQLConn.end();
    console.log(err);
})
;

//writelog.end();
console.log('** End of Program **');


テーマデザインはとりあえずデフォルトのものを使用している。ゆくゆくはカスタマイズするつもりではある。いつになるかはわからないが。。

リダイレクト設定

次に元サイトのurlからはてなブログへ移行するためのリダイレクト設定を行った。私はnginxを使用しているので下記のようなrewrite設定を行った。エクスポートファイルのBASENAMEをpost_nameにしておいて、あとはnginxでURL書き換えを行い、記事ごとに301転送を行うようにしている。

location /blog/ {
   rewrite ^.*$ http://sfpgmr.hatenablog.jp/ permanent;
}

location ~ ^.*/blog/.+/([^/]*)/$ {
   rewrite ^\/blog\/.*\/([^\/]*)\/$ http://sfpgmr.hatenablog.jp/entry/$1 permanent;
   break;
}

今のところこれで転送はできている。あとはGoogleやBingのウェブマスターツールのサイトマップを変更してとりあえず移行は終わらせた。