- As is usual -

[WordPress]本文中に使われている最初の画像を抽出する

Creation date: 2011-06-22 10:36:47 +0900 JST
Updated: 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タグを出力すれば指定したサイズの画像を表示できる。