内部リンクを壊さずに FC2 ブログの記事を WordPress にインポートする

内部リンク切れを起こさずに FC2 ブログを WordPress サイトに移行する際の手順です。 ブログ記事番号を合わせることで、FC2 ブログからの個別記事へのリダイレクトも可能なようにします。 ある程度プログラムや HTTP、HTML の知識がある人向けで、説明を端折っている部分もあります。 スクリプトプログラム等もダウンロードできるようにしていますが、環境に合わせて修正が必要となるので最終的には自己責任でご利用ください。 WordPress のバージョンは 3.3、3.4 で試していますが、Movable Type and TypePad Importer のバージョン (0.4) の方が重要です。 これ以降の説明はホスト名として実際に私が行った blogger323.blog83.fc2.com (FC2) と hetarena.com (WordPress) を使用します。

以下の条件で移行を行います。

  • http://blogger323.blog83.fc2.com/blog-entry-NNN.html を https://hetarena.com/archives/NNN に対応させます。(追記: 他のパーマリンク形式が良い人はコメント欄参照。)
  • FC2 にこれまでアップロードしたファイルは https://hetarena.com/oldimages/ の下に置きます。

手順の概要は以下の通りです。

  1. FC2 ブログでエクスポートした記事と sitemaps.xml を使用して、各記事に ID (先述の URL 内の NNN の部分) を付与したエクスポートデータを作成します。
  2. 記事中の内部リンクの変換を行います。
  3. Movable Type and TypePad Importer を一部変更し、ID を読むようにしてから記事をインポートします。
  4. 画像の引越し、FC2 のリダイレクトの設定を行います。

インポートするデータの作成

実際の手順では先の 1. 2 を合わせてプログラムで処理しました。 FC2 ブログの記事をエクスポートし、UTF-8 に変換して blogger323.txt として保存します。 続いて http://blogger323.blog83.fc2.com/sitemaps.xml をファイルとして保存します。 こちらの perl スクリプトをダウンロードし、先の 2つのファイルと同じディレクトリに置いて以下を実行します。

perl fc22wp.pl blogger323.txt > blogger323_wp.txt

これで「ID: 」の行が足され、更に内部リンクの変換が行われます。 perl のスクリプトについて簡単に説明すると以下の処理をしています。

  • blogger323.txt の「DATE:」行を sitemaps.xml の「<lastmod>」の日時とマッチさせ、記事番号の含まれる「ID:」行を挿入する。
  • blog-entry-NNN.html を archives/NNN に変換
  • blogger323.blog83.fc2.com を hetarena.com に変換
  • http://blog-imgs*.fc2.com/b/l/o/blogger323/ を /oldimages/ に変換

使い捨てで書いているので使用する際は「blogger323」、「hetarena.com」の含まれている行を適切に修正し、処理内容を確認してから使用してください。 まあ、短いプログラムなので見ていただければ perl を知らなくても何をしているか想像がつくと思います。

インポートの実行

WordPress に標準でついてくる「Movable Type and TypePad Importer」(Version 0.4) を使用しますが、そのままだと「ID:」行を読んでくれません。 そこで movabletype-importer.php に以下の修正を行います。 (wp-content/plugins/movabletype-importer/ の下にあるファイルにこのパッチファイルを当てても良いですが、WordPress 管理画面の「プラグイン編集」から修正するのがお手軽です)

--- movabletype-importer.php.orig       2011-01-15 09:53:03.000000000 +0900
+++ movabletype-importer.php    2011-08-02 20:22:59.000000000 +0900
@@ -388,6 +388,10 @@
                                $slug = trim( substr($line, strlen('BASENAME:')) );
                                if ( !empty( $slug ) )
                                        $post->post_name = $slug;
+                       } else if ( 0 === strpos($line, 'ID:') ) {
+                               $post_id = trim( substr($line, strlen('ID:')) );
+                               if ( !empty( $post_id ) )
+                                       $post->import_id = $post_id;
                        } else if ( 0 === strpos($line, 'STATUS:') ) {
                                $status = trim( strtolower( substr($line, strlen('STATUS:')) ) );
                                if ( empty($status) )

import_id はまともに公式解説されていないパラメータなのですが、更新のときは $post->ID に、新規のときは $post->import_id に記事 ID をセットして wp_insert_post を呼ぶと希望通りの ID で記事が更新/作成されます。

安全を期すならば blogger323_wp.txt をインポートする前に記事ID の大きなダミーデータを 1つ作成してインポートしておきます。 import_id で指定した番号の記事が存在すると既存最大 ID + 1 の番号が振られて記事が作成されてしまうのですが、こうしてダミーデータを入れておけば万が一既に記事が存在していたとしてもダミーデータの後ろの番号で作成され、続く記事のインポートに影響を与えません。

そのほかもろもろ

他にもいくつか実行しておくべきことがあります。

  • WordPress でパーマネントリンク設定を行って archives/NNN 形式を選んでおきます。
  • FC2 にアップロードされているファイルをダウンロードして WordPress ディレクトリの下の oldimages の中に置きます。 ダウンロードするファイルが多い場合は何かツールを使うなりしてダウンロードしましょう。 (私は HTML からリンクを取り出して wget を回すスクリプトを書いたような気がします)
  • RSSフィード読者向けに FC2 側に移転告知エントリを一つ書いておく必要があると思います。 FeedBurner を使っていれば、Original Feed URL を変更することで読者の手を煩わせることなく引き続きフィードを提供することができます。 しかし、この場合もリーダー上で既読情報等がリセットされるようなので告知をしておいた方が良いでしょう。
  • どこまでやるかという問題になるのですが、ここまでの手順で救えるのは個別記事 URL です。 カテゴリーやタグつき記事に対してのリンクが記事中に大量に埋め込まれている場合、それらへの手当ても必要かも知れません。 一つの手として Redirection プラグインを使う方法を紹介しておきます。 Redirection プラグインでは正規表現も使えるので、例えば「/\?tag=(.*)」→「/?s=$1」みたいなルールを作るとかつてタグで指定していた単語での検索結果を表示するようになります。
  • WordPress サイトの準備が整ったら FC2 テンプレートに meta refresh でリダイレクトする設定を入れます。 あと rel="canonical" の <link> タグも入れておいた方が良いでしょう。

最後の FC2 テンプレートの件については説明が必要ですね。 まずはリダイレクトは以下の記述を <head> セクションに追記します。 (実際は改行なしで書いています)

<meta <!--index_area--><!--/index_area--> http-equiv="refresh" 
content="0;URL=https://hetarena.com/<!--permanent_area-->
<!--topentry-->archives/<%topentry_no><!--/topentry--><!--/permanent_area-->" />

リダイレクトの設定についてはこちらの記事を参考とさせていただきました。 続いて <link> タグですが、以下の記述を同じく <head> セクションに追記します。

<!--permanent_area--><!--topentry-->
<link rel="canonical" href="https://hetarena.com/archives/<%topentry_no>" />
<!--/topentry--><!--/permanent_area-->

ところで

hetarena.com を立ち上げてからこれまでは FC2 ブログを Twitter のつぶやきアーカイブ用に使っていたのですが、最近、WordPress のカスタム投稿タイプを使えば hetarena.com 側でアーカイブしてもブログ記事と混ざらないことに気づき、FC2 ブログの方は閉鎖することにしました。 そんなこともあってこんな記事を書いてみたのでした。 ちなみにつぶやきアーカイブはこちらです。


コメントいただいたので、ちょっと追記

実行例を挙げておきます。 まずコマンドプロンプトを開きます。 アクセサリの下にありますが、スタートメニューで cmd.exe と入力してもコマンドプロンプトを実行できます。 まずディレクトリを作成します。まあ、ここはエクスプローラーで実行しても良いですが。

C:\Users>blogger323>mkdir c:\temp
C:\Users>blogger323>cd \temp
C:\temp>

強調部分が入力するところです。 ここまでで C:\temp フォルダができているので必要なファイルをそこに入れます。 そして perl コマンドを実行します。

C:\temp>perl fc22wp.pl blogger323.txt > blogger323_wp.txt

これで C:\temp フォルダの中に blogger323_wp.txt というファイルができます。

「内部リンクを壊さずに FC2 ブログの記事を WordPress にインポートする」への20件のフィードバック

  1. はじめまして!
    記事を参考にFC2ブログをワードプレスにインポートしたいと思っているのですが、
    perl のスクリプトを実行させる方法が分かりません。
    わからないことは以下のとおりです。
    1.ワードプレスのどこのディレクトリにtxtとsitemap.xmlとplを保存すればいいのか。
    2.plはどうやったら実行できるのか。

    他の部分は出来そうなのですがplについては一切知識がないので、
    理解できずにいます。
    是非とも挑戦したいので、出来ればご教授願えると助かります。
    ちなみに使っているのはエックスサーバーというレンタルサーバーです。

  2. ぽん太さん、何事もチャレンジですよね。頑張りましょう。

    1. ここはまだ WordPress と関係ない処理なので好きなディレクトリで実行すれば良いです。全てのファイルが同じディレクトリにあることが重要です。エクスポートしたファイルが処理対象なので、例えば Windows をお使いならば Active Perl をインストールして使うなどクライアント側で処理すると楽かも知れません。

    2. ‘perl fc22wp.pl’ の部分で指定したプログラムファイルが実行されます。perl コマンドが使用可能な環境でなければなりません。

    最初はうまくいかないかも知れないので、数件分の記事データで練習すると良いと思います。説明記事はあっさり書かれているので未知の部分があると大変でしょうが、必要な項目は網羅していると思うので、うまく行かなかったときは再度読み返してみてください。

  3. おはようございます!
    こんなに早くご回答いただけるとは思っていませんでした、本当に有難うございます。
    parlの処理はクライアント側で行えばいいんですね!
    今、Active Perlをダウンロードしたので、挑戦してみます。
    成功したかどうかは後ほどご連絡させて頂きます。がんばります!

  4. 再びすみません。
    早速実行してみたのですが、can’t open your ‘sitemap.xml’ at C:¥名前¥Desktop¥wp¥fc22wp.pl line7と
    表示され、実行できませんでした。
    これはsitemap.xmlが開けないということですよね。
    私の保存方法がいけないのでしょうか。
    自分でもperlの使い方を調べてはいるのですが、どうしても分かりません。
    聞いたばかりではいけないと思っているのですが、何卒ご教授ください。

  5. エラーメッセージの解釈はその通りです。デスクトップに保存するといろいろ難しいので、C ドライブの下にディレクトリを作ってコマンドプロンプトを使って実行します。本文の方にやり方を書いたので試してみてください。作業後はディレクトリは消してしまってかまいません。

  6. こんばんは!
    本文に分かりやすく作業方法を書いていただいたおかげで無事にデータの変換を
    行うことが出来ました。
    本当に助かりました、ありがとうございます。
    その他の作業も無事完了できそうです。

    ところでWordPress でパーマネントリンク設定を行って archives/NNN 形式にしたのですが、
    このパーマネントリンクの形式は、今後ずっと変えられないでしょうか。

    出来れば自分で好きなアドレスを入力する%postname%を使えられたらいいなと思っています。
    完全に移転が終わってクローラがFC2ブログの方をクロールしなくなったら
    変えても大丈夫なものでしょうか。

  7. 次の理由で途中からパーマネントリンクの形式を変えるのはお勧めしません。

    1. 外部リンク (誰かがぽん太さんのブログにリンク) や内部リンク (自分の別記事を紹介) が無効になる。
    2. 検索エンジン (Google 等) に登録されたインデックスが無効になる。

    もし、どうしても %postname% 形式にしたいのであれば、最初からその形式にして FC2 からのリダイレクトは /?p=NNN 形式へ行うようにすれば良いでしょう。実は /?p=NNN 形式は他のパーマリンク形式に変更した後でも 有効で、アクセスすると設定したパーマリンク形式にリダイレクトされるのです。

  8. /?p=NNN形式で、うまく変更できました。

    すべて移転を終えてからお礼に伺おうと思い、お礼が遅れてしまい申し訳りません。
    まだまだ整形に時間がかかりそうなので、ひとまずお礼に伺いました。

    改行を入れるのに時間がかかりそうなので、まだ完全移行には至ることが
    出来ていませんが、blogger323様のおかげで思った通りの移転ができそうです。

    本当に何から何までお知恵をお借りして感謝でいっぱいです。
    本当にありがとうございました!

  9. ということは自分で考えていろいろ工夫してみたということですね。ナイスファイト!

  10. お久しぶりです、ぽん太です。
    昨年は大変お世話になり、ありがとうございました。

    実は、移転に付随する作業は滞りなく行ったんですが、グーグルのインデックス状況が
    おかしくて、FC2ブログの方へ戻りたいと思っています。

    そこで、ほかでも質問したんですがどうしても思うような回答がもらえず、
    blogger323様のところへ再びお邪魔しました。

    こちらに書かれていないことなのですが、お分かりになるようでしたら教えて
    いただけると幸いです。

    現在の状況としてはFC2ブログのテンプレートに以下のように記載しています。
    ですので、これを全て消してワードプレスの.htaccessにFC2ブログへの301リダイレクトを
    書いて、元に戻したいと思っています。


    <link rel="canonical" href="http://example.jp/?p=” />

    <meta http-equiv=”refresh”
    content=”10;URL=http://example.jp/
    ?p=” />
    <meta name=”robots” content=”noindex,follow”>

    いくつかの記事は新ブログの方に置き換わっているので、それを.htaccessに下記のように
    記述して、リダイレクトしようと思ったのですが、うまく行きません。

    間違っている記述などわかるようでしたら、教えていただけると幸いです。

    この部分は自分で書いた部分で、301リダイレクトをしたいための記述です。

    RewriteEngine on
    RewriteRule ^/?p=(.*)$ http://example.blog91.fc2.com/blog-entry-$1.html%5BR=301,L%5D

    ここから下はwordpressで自動に出力される記述部分です。
    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ – [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress
    AddOutputFilterByType DEFLATE text/html text/css application/x-javascript application/javascript text/javascript

  11. すみません。いただいたコメントがスパムに分類されていたため、反応するのが遅くなりました。Akismet の日本語コメント処理は今一つ信用がおけないです…。

    さて、既に解決されているかも知れませんが、リダイレクトの設定についてです。以下のように記述を変えたらうまくいかないでしょうか? スペースとカッコがないのが気になります。

    RewriteRule ^/?p=(.*)$ http://example.blog91.fc2.com/blog-entry-$1.html [R=301,L]

  12. blogger323さま

    ご無沙汰しています。その節は大変お世話になりました!
    最後のコメントでFC2ブログに戻ろうと思うと書きましたが、結局のところ、
    せっかくいろいろ作業してblogger323さまにも助言いただいたのに無駄にするのは
    もったいない!!と思って、新ブログを続けていたところ、
    ようやく昨日検索流入が戻りました。
    嬉しくなって報告に来てしまいました。
    blogger323さまには本当にお世話になり、感謝の気持ちでいっぱいです。
    大変為になるブログですね!これからも色々な記事に期待しています!

  13. 何はともあれ、うまく行ってよかったです。WordPress を使い始めるといろいろ苦労はあると思いますが、やはり自分でいろいろ手を入れられるという点は代えがたいと思います。何かあれば、また気軽にコメントしてください。

  14. blogger323さん、はじめまして!

    9年ほど運営し独自ドメイン化したFC2ブログをそのままワードプレスに移行する方法を求めてコチラにたどりつきました。

    blogger323さんのこの情報はわたしの希望を実現してくれるおそらく唯一の方法。
    ブログの記事は7000を越え118件ほどの削除(欠番)があります。(全記事エキスポートテキストのサイズは30MBほど)

    Perlはまったくわかりませんが、アクティブパールをインストールして記載されている通りにさっそくやってみました。すると何度やっても・・・

    something wrong ! (date:2004……) at fc22wp.pl line31, chunk 1.

    となってしまい困っているところです。

    お忙しいと思いますが、アドバイスいただけませんでしょうか。よろしくお願いいたします。

  15. このプログラムでは、記事番号 (blog-entry-*.html の * 部分) を見つけるのに sitemaps.xml とエクスポートしたデータの日付を突き合わせる処理を行っています。ひょおどうさんのエラーメッセージはこの処理でエクスポートデータにはあるものの sitemaps.xml 側にはない日付があるため処理に失敗したことを示しています。
    まずはメッセージ中に示されている日付を持つ記事が sitemaps.xml 内に存在しているか確認していただけますか?

  16. blogger323さん,
    ご多用のなかご返信をいただき本当にありがとうございます。
    確認してみたところ・・・・・

    「メッセージ中に示されている日付を持つ記事が sitemaps.xml 内に」ありませんでした。これがエラーの原因だったんですね?

    sitemaps.xml には、おおむね新しいほうから2000個のURL(5000~7000)しか存在しませんでした。

    今、自分でもすべてを保存できる方法を探しています。対処法をご存知でしたらぜひアドバイスをお願い致します。

  17. それらしい情報を見つけることができませんでしたが、数の制限があるのですかね。私の場合、記事数は 3桁だったので特に問題なく sitemaps.xml をつくることができました。その記事数で使えるかどうかわかりませんが、 http://seo.fc2.com/sitemap/ のようなツールもあります。

    何故 sitemaps.xml が必要かというと、エクスポートしたデータに記事番号がついていないからなのですが、必ずしも「日付 – 記事番号」という紐付けである必要はなく「タイトル (重複なし) – 記事番号」のような情報があればプログラムを修正して処理することができると思います。sitemaps.xml にあるものだけ処理するようにもできなくはないですが、記事数が減っちゃいますし…。

  18. blogger323さん。こんにちは!

    「Website Explorer」ですが、上手くいきませんでした。

    1、4~5時間経った気がするのに完了する気配がないので手動でソフトを停止。
    2、「blog-entry」以外をフィルター機能で除外して再度挑戦。2時間ほどで完了。しかし、1000番以下のエントリーがごっそり抜けている。
    3、「blog-entry」「page-」以外をフィルター機能で除外してみたび挑戦。6時間を越えたところでソフト自体がフリーズ。
    4、疲れきるw。断念。

    ということでエントリーの多いブログには向かないみたいです。

    今後、少し休んでから・・・・・
    1、欠番をコツコツと手動で埋めていく。
    2、実際にワードプレスに連番でインポートできるかテスト検証。
    ・・・・・してみる予定です。

    また、ご報告します。
    このたびは、ご親切にアドバイスいただきありがとうございました!

  19. お疲れ様でした。ちょっと残念でしたね。

    欠番のリストさえできてしまえば何とかなりそうな気はするので、まずはそこですね。内部リンクの変換についてはプログラムを書かなくても WordPress の文字列置換プラグインを使ってできそうです。何にせよ、試行錯誤が必要そうなので mysql のバックアップを取りながらの作業が良いです。言わずもがなかも知れませんが。

    何かあれば気軽に聞いてください。

コメントは停止中です。