さくらのブログ、FC2ブログからWordPressへの移行、記事URLの対照

 さくらのブログやFC2ブログからWordPressへの移行するという作業をいくつか行いました。
 その手の記事は色々あるのですが、ここでは移行そのものというより、移行後の記事URL変換、リダイレクトやrel=”canonical”による移行案内などについてメモしておきます。

エクスポート、インポート

 まず移行そのものですが、FC2ブログからWordPressへの移行については、

FC2ブログからWordPressへの移転方法(エクスポート編) | ServerKurabe

 が非常に良記事でした。このページから順にたどることでおおよそのことはわかります。
 ざっくりおさらいすると、

①FC2ブログにて ツール>データバックアップ>エクスポート>ダウンロード で全記事エクスポート
②ツール>データバックアップ>ファイルバックアップ にて順に「リストを開く」をクリック、開いた先のページを「ファイル>名前をつけて保存(webページ、完全)」。これを順に行い、すべての画像を一つのフォルダにまとめておく(先記事ではmovedフォルダ)
③WordPressにてImport Movable Type or TypePadをインストール。一度ローカルにダウンロードするなりして、
455行目 if( !empty($line) ) → //if( !empty($line) )
456行目 $line .= “\n”; → $line .= “
“;
 と修正しアップロード(そのままインポートすると改行が反映されないため)
④Import Movable Type or TypePadを有効化、ツール>インポート>「Movable Type と TypePad」、①でエクスポートしたファイルを指定し「ファイルをアップロードしてインポート」
⑤画像ファイルを「~/WordPressをインストールしたフォルダ/wp-content/uploads」にアップロード。つまりuploads/movedにすべて格納。
⑥Search Regexプラグインをインストール。旧サイトでの画像パス「src=”******/.拡張子”」の「******」部分を検索し、新規サイトのパス「http://新規ドメイン名/WordPressをインストールしたフォルダ/wp-content/uploads/moved」に置換。

 以上で記事と画像についてはインポートできます。
 さくらのブログでも似たようなもので、 設定>エクスポート から全記事を出力します。その際、記事数が多すぎると一括エクスポートできないため、期間指定していくつかのファイルに分割する必要があります。
 画像ファイルの方は /home/YOUR_ACOUNT/sblo_files/YOUR_BLOG/images に格納されているのでFTPでダウンロードし、上記のmovedの要領でwp-content/uploadsにアップロードすれば良いです。
 画像パスの置換も同様。それぞれの設置場所に合わせてSearch Regexで置換します。

リダイレクト

 さてここからが本題です。
 本来であればサイトの移転は.htaccessを利用し301リダイレクトすれば良いのですが、FC2ブログでもさくらのブログでも.htaccessは自由に設置できません。一般のブログサービスはほとんどそうでしょう。
 次善の策としてrel=”canonical”による案内とmeta refreshで新サイトに飛ばす、という方法が一般に紹介されています。実際、それくらいしか方法がないと思います。
 問題は一つの記事がどのURLからどのURLになったのか、その対応関係です。これはrel=”canonical”で指定するURLもそうですし、記事内にあるブログ内リンクの修正でも問題になります。新規サイトにインポートしても、記事内リンクは旧サイト内の記事を指しているので、できればこれを修正したいところです。一個ずつ手動で直すのは途方もない作業になります。
 そこで、完全とは言い難いのですが、以下のような方法をとりました。
 ちなみにphpやmySqlの最低限の知識は必要です。

 まず、URLなりIDなりの対応テーブルを作ります。WordPressのDBをインストールしているデータベースにW_RELATIONとか何とか、好きな名前の対照テーブルを用意します。パーマリンク設定にもよるのですが、わたしの場合、FC2の時は記事番号とWordPressのwp_postsのID、さくらのブログの時は旧URLとIDの対照としました。
 まずFC2の場合。FC2は記事番号が連番になっているので比較的わかりやすいのですが、下書き保存やリヴィジョンなどの関係で、単純に5足したらWordPressのIDになる、といった形にはなっていません。
 そこで最初の頭で設定した番号から順番に当たりをつけたFC2側のURLをfile_get_contentsで見に行き、タイトルタグ内文字列を取得し対応関係を確認、違っていたら次の番号に行く、という方法をとりました。
 さくらのブログの場合はそれもできないので、さくらのブログのsitemap.xmlで全記事URLを取得し、まずこれをW_RELATIONにINSERT。その上でこれを順番にfile_get_contentsで取得、タイトルタグを取得、wp_postsを検索し対照を取る、という方法にしました。FC2もこのやり方で良かったかもしれません。
 その際、WordPressの記事タイトルはhtml文字実体参照となっているので、各自良きにはからってください(笑)。勿論文字コードの変換なども。
 以上で対照テーブルができます。

 その上で、rel=”canonical”で指定するのは記事URLそのものではなく、例えばWordPress直下にredirect.phpのようなファイルを用意し、そこに自分の記事番号を引数に渡す形で指定します。rel=”canonical”やmeta refreshでredirect.php?num=1のような形を書いておくわけです。そしてredirect.phpの中で対照テーブルを見て本来の記事を見つけてそこに301リダイレクトする、という訳です。
 rel=”canonical”はリダレクトではないものの、連続リダイレクトで大丈夫か?とは思ったのですが、3,4回くらいなら連続リダイレクトしてもGoogleBotは追ってくれるようです。そもそもrel=”canonical”で外部サイトを指して本当に見てくれているのかも謎なので、気休めくらいに思ってやりましょう。
 この方法を使えば、記事内のリンクも簡単に修正できます。旧ブログのドメインで記事を検索し拾ってきた記事を正規表現で見て、対応する新URLを検索、順番に置換していけば良いだけです。

 一つイラッと来たのは、さくらのブログのテンプレートでは、ヘッダ内で自分のURLなり記事番号なりを見る方法がないみたいなのですね。<% article.page_url %>で見られそうなものなのですが、ヘッダ内ではエラーになります。仕方がないので<% extra_title %>で取得した記事名を引数に渡すことにしたのですが、これをurlencodeする属性も使えません。そのまま引数につけるだけです。
 あまりに心許ないので、redirect.php側ではまずリファラを見て、そのURLから対照テーブルを検索できれば実行。それができなかった時に次善の策として記事名で検索。それもダメなら仕方ないので新規ブログのトップページにリダイレクト、という仕様にしました。

 以上がおおよその考え方です。
 別にphpで書かなければいけない理由もないので、各自の環境で楽な方法で実装して頂ければ良いと思います。