【WordPress】 アンテナサイト用サムネ画像をWordPressに取り込む

ぼちぼち動き始めます。
cookieに関するまとめもしたかったのですが、ちょっと後回し。

現在突貫でアンテナサイトにサムネ画像をつけようとしています。
やっぱりサムネがユーザーを導く力は大きく、はじめから付けておくべきものでした。

フィードからサムネ画像を取得しメディアライブラリに登録するあたりが難解だったので、記録しておきます。

スポンサーリンク

サムネ画像の扱い

まずサムネ用画像はどう用意するかで悩んでいました。

①サムネ画像はキャッシュとしてダウンロードしてから使う。
②画像掲載サイトから直リンクで使う。

フィードで抜粋内に画像URLが配信されているので、そのまま使うと直リンクになります。
こういう仕組みのものなので本来は直リンクで使って問題ないものでしょう。

しかし困ったことに、記事サイト自体が画像を他サイトの直リンクで使っている場合が結構あるのです。
そして他サイトの画像URLをフィードとしてばらまいているのです。
海外の反応ブログでは必ずネタ元になるサイトがあるので、ネタだけでなく画像とリソースもオリジナルサイトに任せてしまうというちょっとグレーなやり方です。
またゲームやニュースなどの話題では、公式サイトから直リンクということも多くあります。

オリジナルの画像を掲載しているサイトとしては、アクセスがないアンテナサイトから画像だけを一日数十万回と叩かれるのは不本意でしょう。
そんなこともあり、サムネ画像はキャッシュとしてダウンロードし小さくトリミングしてから掲載することにしました。

中には全く関係ないサイトから画像だけ直リンクでパクっているアバンギャルドなサイトもあります。
たどってみると個人の旅行ブログだったり食事ブログだったり。

キャッシュ化もそれはそれでグレーですが、まあ実害をできるだけ小さくということで。

ちなみにフィード内で画像URLを配信してるのは全体の70%程度です。
ほとんどの記事でアイキャッチとして画像が使われていますので、本当に全ての記事にサムネを付けたいのであればスクレイピングで記事ごとぶっこ抜く必要があります。
それはさらにグレーが濃くなるのと、今のレンタルサーバーのリソースでは不可能です。

サムネが抜けた記事は代替となる画像を用意しないといけないですね。

フィードから画像URLを取得

まず配信されたフィードから画像のURLを取得します。
functions.phpに作ったフィードを解析してWordPressの記事として取り込む「getfeed関数」に画像に関するコードを追加します。

フィードから記事タイトルなどを解析している箇所に以下のコードを追加。

/* フィード内の画像url取得 */
$content_string = $item->get_content();	//フィード内の抜粋コンテンツを取得
preg_match('/<img.*>/i', $content_string, $img_tag_string);	//imgタグ部分を取得
preg_match('/http.*?(\.gif|\.png|\.jpg|\.jpeg)/i', reset($img_tag_string), $img_url);	//httpから拡張子までを切り取り
$list['thumbnail'] = reset($img_url);	//配列の一番最初だけを代入
/* フィード内の画像url取得 */

$list[‘thumbnail’]はWordPress記事として記載する際に使っています。

画像のダウンロード

/* 画像ダウンロード */の箇所を追加しています。
記事として追加したあとで発行される記事idを使って画像も取り込みます。
細かいechoはデバック用なので気にしないでください。

/* insert post */	//データベース取り込み
if ($duplicate_num == 0 ) {	//同じ記事URLがない場合
	$insert_id = wp_insert_post( $post );		//DBへ格納し、自動採番される投稿IDを取得
	if ($insert_id) {
		echo "post OK / ";
		echo $insert_id;
		echo $list['title'];
		echo $list['link'];
		update_post_meta($insert_id, 'custom_title', $list['title']);	//例)カスタムフィールドに記事タイトルを追加する場合


		/* 画像ダウンロード  */
		$dl_img_url = reset($img_url);//画像配列の一番最初だけを代入
		echo $dl_img_url;

		if (get_headers($dl_img_url) && $img_type = exif_imagetype($dl_img_url)){

			echo "ファイルは存在します";
			$dl_img_data = file_get_contents($dl_img_url);
			switch($img_type){	//パーミッションの変更は必要なし
				case IMAGETYPE_GIF:	//gifの場合
					echo "IMAGETYPE_GIF";
					$fPath =  '/home/hogehoge/www/test01/wp-content/uploads/img_'.$insert_id.'.gif';
					file_put_contents( $fPath ,$dl_img_data);
					addMediaLib($insert_id, $fPath);	// メデイアライブラリに登録、各サイズのサムネ作成

				break;
				case IMAGETYPE_JPEG:	//jpgの場合
					echo "IMAGETYPE_JPEG";
					$fPath =  '/home/hogehoge/www/test01/wp-content/uploads/img_'.$insert_id.'.jpg';
					file_put_contents( $fPath ,$dl_img_data);
					addMediaLib($insert_id, $fPath);	// メデイアライブラリに登録、各サイズのサムネ作成
				break;

				case IMAGETYPE_PNG:	//pngの場合
					echo "IMAGETYPE_PNG";
					$fPath =  '/home/hogehoge/www/test01/wp-content/uploads/img_'.$insert_id.'.png';
					file_put_contents( $fPath ,$dl_img_data);
					addMediaLib($insert_id, $fPath);	// メデイアライブラリに登録、各サイズのサムネ作成
				break;

				default:	//どれにも該当しない場合
					echo "gif、jpg、png以外の画像です";
			}
		}else{
			echo "ファイルが存在しません";
		}
		/* 画像ダウンロード  */


	} else {
		echo "post failed";
		}
} else {
	echo "post skip";	//同じ記事がある場合はスキップ
}

addMediaLib関数はfunctions.phpで新たに定義するメディアライブラリに追加するための関数です。

addMediaLib関数追加

メディアライブラリに追加して各サイズのサムネを生成する関数です。
funcions.phpに追加します。

// ダウンロードした画像をメディアライブラリに取り込む
function addMediaLib($postID, $fPath){	//postID:画像を関連付ける記事のID fPath:画像ファイルのフルパス
	$wp_filetype = wp_check_filetype(basename($fPath), null );	//ファイルが有効な形式化を調べ、画像形式を配列で返す
	$wp_upload_dir = wp_upload_dir();	//アップロードのパスを配列で取得
	$attachment = array(	//画像を取り込むための配列作成
		 'guid'  => $wp_upload_dir['url'] . '/' . basename($fPath),	//アップロード先のディレクトリに画像ファイル名を連結 
		 'post_mime_type' => $wp_filetype['type'],	//mime形式「image/jpeg」などを取得
		 'post_title' => preg_replace('/\.[^.]+$/', '', basename($fPath)),	//画像ファイル名から拡張子を消す
		 'post_content' => '',		//???
		 'post_status' => 'inherit'	//受け継ぐ???
	);

	$attach_id = wp_insert_attachment( $attachment, $fPath, $postID );	//画像IDを取得

	require_once( ABSPATH . 'wp-admin/includes/image.php' );	// wp_generate_attachment_metadata()を使うためにインクルード

	$attach_data = wp_generate_attachment_metadata( $attach_id, $fPath );	//画像添付ファイルのメタデータの作成
	wp_update_attachment_metadata( $attach_id,  $attach_data );		//画像ファイルの再作成

	return $attach_id;
}

相変わらず切り貼りして「動いた動いた」というレベルのひどいコードですので、もし使うなら一度精査してみてください。

動かしてみると

この通りフィードの取得と同時にメディアライブラリに登録されています。

20150228_img_dl_01

サムネも各サイズが自動で生成されています。

20150228_img_dl_02

こんな感じの仕組みでフィード取り込みと同時にサムネ画像が用意出来ました。

記事一覧を出力する際にこの画像ファイルを指定すればサムネ付きアンテナサイトの完成です。


スポンサーリンク
  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA