WordPressで構築した私のサイトでは、FeedWordPressプラグインを利用してFC2ブログのRSSから記事を流し込んでいる。しかし、FC2ブログの画像は、直リンク不可、他サイトから利用できない仕様(以前は直近の記事は表示していましたが、、、)。
FC2、FAQ:http://help.fc2.com/blog/qa/group16/810/
というわけで、記事中の画像だけが表示されないという情けないことに!
FC2内から見ているように偽装する?ってそんなことできるわけないし。
何か良い方法は無いものかと考えていると、私のサイトの記事一覧にあるサムネイルは表示されていることに気付く。FC2ブログ記事中の画像をサムネイル化しているだけなのに。
何故?
そう言えばサムネイルは自分のサーバから読み込んでいるんだった。
FC2ブログ記事中から画像URLを抽出、その情報を元に、FC2へ保存されている画像を自分のサーバへコピー・保存するように設定している。
どうやらブラウザを通すと他サイトからFC2の画像は表示できないけど、サーバ間ではアクセス可能みたい。
ならば、同じ理屈で画像をすべて自分のサーバへコピーしちゃえばOK♪
早速こんなプログラムを作ってみた。
[codesyntax lang=”php” title=”PHP”]
function fc2_blog_content(){ $uploads = wp_upload_dir(); $out_file_dir = $uploads['basedir']."/img_fc2_blog/"; $img_fc2_blog_dir = "http://www.hogehoge.com/wp/wp-content/uploads/img_fc2_blog/"; $img_source_dir_pattern = '/http:\/\/blog-imgs-XXX.fc2.com\/h\/o\/g\/hogehoge\//i'; $get_the_content = get_the_content(); $pattern_img = '/[\'\"]http?([\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+\$\,\%\#]+(jpg|jpeg|gif|png))/i'; preg_match_all($pattern_img, $get_the_content, $matches_img); foreach( $matches_img[0] as $img_source_url ){ $img_source_url = preg_replace('/[\'\"]/','',$img_source_url); $out_file_path = preg_replace($img_source_dir_pattern,$out_file_dir,$img_source_url); if( !file_exists($out_file_path)) { $img_in = file_get_contents($img_source_url); file_put_contents($out_file_path,$img_in); } } $get_the_content = preg_replace($img_source_dir_pattern,$img_fc2_blog_dir,$get_the_content); echo $get_the_content; }
[/codesyntax]
プログラムの流れ
1.自サーバへ画像が保存されているかどうか調べる。
2.もしあればその画像を表示。
3.画像が保存されていなければ、記事中から画像URLを取得。
4.その情報を元に、画像をFC2サーバから自サーバへコピー・保存。
要するに、一番最初にページを見た人が犠牲になる仕様、少しだけ動作が遅くなる^^;
画像を保存するディレクトリ(img_fc2_blog)はあらかじめ作っておく。
このプログラムをfunctions.phpにでも記述。FC2記事を流し込むテンプレートからfc2_blog_content()を実行すればOK。
「WordPress」+「FeedWordPress」用だけど、少し手を加えればそれ以外のサイトでも設置できますね。