FC2 から WordPress へ移行するためにやるべきことのまとめ

  • ????????????????????

FC2 blog から wordpress へ記事を移行するためのまとめです。

このページを参考にさせてもらいましたが、画像の部分などもうすこし楽にできるようにカスタマイズしてみました。レンタルサーバやVPSで Linux (Ubuntu) を使っていることを念頭にしていますが、ruby の使える環境ならば適宜読み替えれば windows でも大丈夫だと思います。ですが、プログラム言語なんてなんのことだかさっぱりな人は別の方法を探ったほうがいいかもしれません。

はじめに

この方法ではサイト内リンクがリンク切れになってしまいます。インポートする記事たちの wordpress のパーマリンクを確定できればリンク切れを生じさせないことが可能なのですが…

あと、この方法を試すときは時間に余裕があれば、テスト用のブログで一度インポートしてみることをお勧めします。私自身はこの方法で問題なくインポートできましたが、実行する際は各自の責任でお願いします。

それでは、実際にインポートの手順を示します。

記事のテキストファイルを入手する

まずは fc2 の管理画面でバックアップ機能を使ってダウンロード。XXX.txt というテキストファイルが入手できます。 XXX.txt は Movable type の形式だそうです(特に気にすることはないですが)。

基本的な変換(文字コードなど)

ダウンロードした XXX.txt は文字コードが EUC-JP なので、UTF-8 に変換して、さらに状態を下書きにします[1]。下書きじゃなくていきなり投稿する!ってひとは sed ~ のくだりを省略してください(非推奨)。だいたい次のような感じでしょうか。

$ sudo apt-get install nkf    # nkf がない場合
$ cd ~/work/fc2       # 適当な作業フォルダへ移動。
$ ls
#  XXX.txt       # サーバでなくローカルにインストールした場合はFTPなどでアップロードしてください
$ cat XXX.txt | nkf -w | sed -e 's/STATUS: Publish/Status: Draft/g' > XXX_utf8.txt

画像の一括ダウンロードと記事内の画像URLの書き換え

以下の作業をすることで画像が images フォルダにダウンロードされ、XXX_utf8.txt の中の画像URLを適切なURLに書き換えた newfile.txt というファイルを作成されます。これはもう少しあとで使います。

このために getfc2img.rb という ruby スクリプトを使います(ソースコードは少し下に貼り付けてあります。)。この getfc2img.rb の最初の数行の設定部分を自分用に書き換える必要があります。具体的には三箇所です。詳しくはソースコードを読んでください。

$ sudo gem install hpricot   # ruby の hpricot ライブラリがない場合
$ mkdir images
$ vi getfc2img.rb   # 画像ダウンロードスクリプトを自分の設定に書き換え(後述)
$ ruby getfc2img.rb
#!/usr/bin/ruby

# このスクリプトは fc2 サーバに存在する画像ファイルの
# img タグの src と a タグの href を書き換えます。

# Your fc2 image server URL
fc2url_pre="http://blog-imgs-"     # サーバの番号を書く必要なし
fc2url_post=".fc2.com/X/X/X/XXX/"  # 1. 自分のアップロードフォルダに書き換え(通常はユーザー名っぽいの)

# Your wordpress Upload folder URL
# 2. wordpress がインストールされているURL:YOUR_DOMAIN と WP_ROOT を書き換え
wpurl="http://www.YOUR_DOMAIN.org/WP_ROOT/wp-content/uploads/fc2"

# Your fc2 article file
fc2file="XXX_utf8.txt"   # 3. UTF8 に変換した fc2 の記事ファイルの名前に書き換え

# New article file
newfile="newfile.txt"
 
#-- 設定ここまで ------------------

require 'rubygems'
require 'hpricot'
require 'open-uri'

rfc2url=Regexp.new(fc2url_pre+"[0-9]+"+fc2url_post)

doc=Hpricot(open(fc2file))
(doc/:img).each { |img|
  imgurl=img[:src]
  puts imgurl
  basename=imgurl.split("/").last
  if imgurl =~ rfc2url
    wpimgurl=imgurl.sub(rfc2url,wpurl)
    img[:src]=wpimgurl
    open(imgurl){ |f|
      open("images/#{basename}","w"){ |fo|
        fo.write(f.read)
      }
    }
  end
}

(doc/:a).each { |a|
  href=a[:href]
  if href =~ rfc2url
    a[:href]=href.sub(rfc2url,wpurl)
  end
}

open(newfile,"w"){|fo|
  fo.write(doc.to_html)
}

画像を wordpress のインストールフォルダへコピー

newfile.txt を wordpress にインポートする前に、ダウンロードされた画像をwordpressのメディアディレクトリにコピーしましょう。しかし、コピーしただけではメディアライブラリに登録されません(wordpressの管理画面に表示されません)。この対策は最後に行います。

/YOUR/WP/ROOT は適宜読み替えてください。Ubuntu+apache なら /var/www/wordpress とかでしょうか。

$ mkdir /YOUR/WP/ROOT/wp-content/uploads/fc2
$ cp -i images/* /YOUR/WP/ROOT/wp-content/uploads/fc2

newfile.txt を wordpress にインポートする

さきほど作った newfile.txt を wordpress インポートするには、wordpress の管理画面から

ツール → インポート → Movable Type and TypePad Importer

を使ってサーバーへアップロード。
画面の指示に従っていれば、特に問題なく終了するはずです。

画像をメディアライブラリに反映させる

最後に先ほど保留したメディアライブラリへの登録を行います。 Add from server プラグインを使って新しくアップされた画像をメディアライブラリに登録しましょう。これは

  • Add from server プラグインをインストール
  • 管理画面→メディア→Add from server で先程画像をコピーした /WP_ROOT/wp-content/uploads/fc2 を指定すればOK

まとめ

この段階ではすべてドラフトです。適宜、リンク切れなどをチェックしたら、下書きから公開状態に変更しましょう。

おしまい。

はてなブックマーク - FC2 から WordPress へ移行するためにやるべきことのまとめ
Pocket

  1. [1] これをやらないと wordpress にインポートした瞬間に記事が公開されます。
  • fp

    この記事を参考にadd from serverを使わせていただき、
    無事メディアライブラリへの登録を完了しました。有益な情報をありがとうございます。

    FC2は分からないのですが、当方はjugemからwordpressへの案件で、
    そもそも投稿にひも付けると言うシステムではありませんでしたので
    画像と、その画像を掲載している投稿との親子関係が設定できず、
    各種のwordpressのテーマの設定を反映できない状態になってしまいました。
    (たとえば、添付画像から自動的にサムネイルをつくる等々)

    いろいろと方策を探したのですが、見当たらず
    (日本語ではこちらが唯一画像とライブラリの問題を扱っているページでした。
    そもそも困っている人がいないのでしょうか…?)
    自力で強引にひも付け作業をすることにしました。
    現在自分のウェブサイトがありませんので、こちらのページに参考までにご報告しておきます。

    1)テーマのindexまたはpost.phpなど、該当するquery_postsを一時的にposts_per_page=999に変更

    2)そのループの中のPHPを一時的に下記に変更(もとのphpはどっかにコピーして置いておく)

    function get_attachment_id($url){
      global $wpdb;
      $sql = “SELECT ID FROM {$wpdb->posts} WHERE post_name = %s”;
      preg_match(‘/([^/]+?)(-ed+)?(-d+xd+)?(.w+)?$/’, $url, $matches);
      $post_name = $matches[1];
      return (int)$wpdb->get_var($wpdb->prepare($sql, $post_name));
    }

    $target = get_the_content();
    preg_match_all(‘/src=”(.*)”/’, $target, $image, PREG_SET_ORDER);
    foreach ($image as $imgsrc) {
        list($item, $dummy) = explode(‘” ‘, $imgsrc[1]);
        $set_src = htmlspecialchars($item);
        $attach_id = get_attachment_id( $set_src );
        if( $attach_id ) {
            $my_post = array();
            $my_post[‘ID’] = $attach_id;
            $my_post[‘post_parent’] = $post->ID;
            wp_update_post( $my_post );
            echo ‘画像ID: ‘. $attach_id . ‘ / 紐付先ID: ‘.$post->ID. ”;
        }
    }
    *記事中に外部画像の直貼がある場合は、念のためpreg_match_allのパターンを限定する形に変更した方がいいかもしれません。

    3)ホームページの記事を表示してくれるページをロードすると全記事の画像のpost_parentをセットしてくれます。

    4)そのあとテーマのphpを元に戻せば終了。

    かなり荒っぽいやり方なので、既存の記事などがある場合、なにやらおかしなことになる可能性は多分にあります。
    引越し時ならやり直しがききますので、自己責任で、という前提ですが、参考になるやもということで書き残しておきます。