2017年以前の旧ブログ
BLOG2017
WordPressで投稿の一覧や抜粋の時、よく投稿の画像を呼び出しますが、この呼び出す画像をアイキャッチ画像ではなくエディタ内にアップされてる画像を全部呼び出してみました。
めったに使う機能ではないので備忘録としてメモメモ。
まずはpreg_match_all を利用し、投稿記事内を検索、画像のパスのみを抽出します。
preg_match_all("/(https?:\/\/)([-_.!*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)\.(jpg|jpeg|gif|png)/iu", $post->post_content, $match);
表示するだけなら、これだけでも使えますが、実際TOPページ等で呼び出す場合はレイアウトを考慮しトリミングした画像がほしいので、ここからさらに別サイズの画像パスに変換していきます。
ちょっと回りくどいですが、
URL > ID > URL(トリミングサイズ画像)
のように変換します。
まずは画像URLからattachemnt_idを取得します。
function get_attachment_id($url)
{
global $wpdb;
$sql = "SELECT ID FROM {$wpdb->posts} WHERE post_name = %s";
preg_match('/([^\/]+?)(-e\d+)?(-\d+x\d+)?(\.\w+)?$/', $url, $matches);
$post_name = $matches[1];
return (int)$wpdb->get_var($wpdb->prepare($sql, $post_name));
}
上記をfunction.phpに記載します。
次にget_attachment_id を利用して サイズ違いの画像URLを取得します。
function get_attachment_image_src($url, $size) {
$image = wp_get_attachment_image_src(get_attachment_id($url), $size);
return $image[0];
}
これで取得準備完了。
実際にget_posts のforeach内で以下のように利用します。
<?php
global $post;
preg_match_all("/(https?:\/\/)([-_.!*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)\.(jpg|jpeg|gif|png)/iu", $post->post_content, $match);
foreach($match[0] as $val) {
$valimg = get_attachment_image_src($val, "post_size");
echo '<img src="'. $valimg . '" alt="">';
}
?>
サイズの指定はfunction.php で
add_image_size('post_size', 300, 250, true);
指定をしてください。
実際に投稿内の記事を全部呼び出すなんてのは、なんのためにアイキャッチ画像があるのかとか考えてしまいますが、画像のURLをIDに変換したりは別の処理で流用もできるので、この機能自体にこだわることもないです。
ちなみにadd_image_sizeで指定しても、それまでに投稿した画像は指定サイズにはなりません。
そんな時は、すでに投稿している画像を一括してリサイズしてくれるプラグインRegenerate Thumbnails が便利です!