[WordPress]本文中に使われている最初の画像を抽出する
Creation date: 2011-06-22 10:36:47 +0900 JSTUpdated: 2011-06-22 10:36:47 +0900 JST
Category: WordPress
WordPressで本文中に掲載した最初の画像を取得するのに、ちょっとしたコードをメモしておく。もしかしたら、プラグインとかであるかもしれないけども…。
get_children ではギャラリーに登録されている画像を取得してきてしまうため、アップロードしたけれど実際に掲載しなかった時や、別の投稿で画像を再利用した時などには取得できない。そこで、本文中からイメージタグのsrcを抽出し、wp_post テーブルを検索して画像の情報を取得する。
PHPソースコード
/**
* 本文中に挿入されている最初のイメージを取り出し、attachment情報を取得する。
* @param object $post
* @return boolean|object
*/
function get_content_first_image(&$post = null) {
if (!$post) return false;
$matches = array();
// 本文中の最初のimgタグのsrcからURLを抽出する
preg_match("/<img[^>]+src=[\"'](s?https?:\/\/[\-_\.!~\*'()a-z0-9;\/\?:@&=\+\$,%#]+\.(jpg|jpeg|png|gif))[\"'][^>]+>/i", $post->post_content, $matches);
// なければ false を返す。
if (!isset($matches[1])) return false;
// 画像のURLからサムネールのサイズ文字列を削除する。
// (ex:http://example.com/xxxxx-300x300.jpg の -300x300 部分)
$pattern = '/(\-[0-9]+x[0-9]+)\.' . $matches[2] . '$/i';
$replace = '.' . $matches[2];
$originalImageUrl = preg_replace($pattern, $replace, $matches[1]);
global $wpdb;
// 抽出し、サムネールのサイズ文字列を削除したURLをキーに wp_posts テーブルへクエリを実行。<br />
$attachment = $wpdb->get_results($wpdb->prepare('SELECT * FROM ' . $wpdb->posts . " WHERE guid = %s AND post_type = 'attachment'", $originalImageUrl));
// 画像の情報が取得できなかった場合には、抽出したURLをキーにして、もう一度クエリを実行。
if (count($attachment) <= 0) {
unset($attachment);
$attachment = $wpdb->get_results($wpdb->prepare('SELECT * FROM ' . $wpdb->posts . " WHERE guid = %s AND post_type = 'attachment'", $matches[1]));
if (count($attachment) <= 0) return false;
}
return $attachment[0];
}
$post データは渡さなくても global $post で取得してもいいかも。
コード使用例
$attachment = get_content_first_image($post);
if ($attachment !== false) {
// ID、サイズ等を指定してimgタグを出力する
echo wp_get_attachment_image( $attachment->ID, 'thumbnail', false, array('alt' => '', 'title' => '') );
}
get_content_first_image() の引数に $post を渡し、画像の情報をオブジェクトで受け取る。
wp_get_attachment_image 等へ 画像のID と サイズ 等を渡し、imgタグを出力すれば指定したサイズの画像を表示できる。