WordPressに画像一覧ページを設置【カテゴリ別対応】

仕事でWPを触る機会があり、タイトルのページが必要だったので下記サイトを参考に弄ってみました。
WordPressにすべての画像一覧ページを設置する

データを引っ張ってくるコアな部分が大幅に変更してあります。
その他の部分は、ほぼ同じです。
無駄なコードもあったりします・・・。

僕、自身 foreach (***) : ←という書き方をしないので混在しております。
可読性を高めたい気もしましたが面倒くさくなって・・・すいません。

あと、細かな部分の対応はしておりませんが、参考程度に上げておきます。
あまりテストしてませんので不具合等ありましたら教えて頂けると助かります。
■デモ
https://inou-e.com/novel

▼機能
・指定したカテゴリで使用した画像データの一覧を表示する
・複数カテゴリに対応
・記事内で一番はじめに使用した画像だけを表示することも可能

★仕組みの説明
・カテゴリー別で記事データを取得
・正規表現で貼り付けた順番通りの画像を取得
・同じタイミングでIDやらカテゴリ名やら日付、タイトル名などを格納
・ページ番号に応じて配列をスライス
・画面に表示

◆使い方
・固定ページを作成
・スラッグを設定
・FTP接続し、テーマフォルダ内?にpage-スラッグ名.phpを作成
・下記コードを貼り付ける
・初期設定部分を変更する
・カテゴリIDを設定する(※カテゴリIDの調べ方は検索してください。)
・ヘッダー、フッター等は下記コードで省いているのでご注意を。
・CSSで体裁を整える

WPのDB内を見るのが初めてだったので、下記サイトが大変便利でした。
WPデータベース構造

独り言:カテゴリ別とはいえ、記事データをすべて取得しているので、ちょいと気になりますが、画像の貼り付け順などを考えると仕方がないのかなと思っております。
あと、使ったページとか教えて頂けるとうれしいです。


<?php
// =================================================== 初期設定
$flg = 1; // 記事内の先頭画像のみ表示[1]、すべて[0]
$per_page =16; // 1ページの画像数
$max_width = 140; //画像幅サイズ
$max_height =140; //画像縦サイズ

// --------------- コメントアウトで切替
$category = "=69"; // 表示するカテゴリ
//$category = "IN(67, 69)"; // 複数カテゴリ指定はコチラ
// =================================================== 初期設定 //ここまで

// SQL
$sql = <<< HERE
select a.ID, a.post_date, a.post_content, a.post_title, a.guid, d.name
from (($wpdb->posts a inner join $wpdb->term_relationships b on a.id = b.object_id)
inner join $wpdb->term_taxonomy c  on b.term_taxonomy_id = c.term_taxonomy_id)
inner join $wpdb->terms d on c.term_id = d.term_id
where a.post_status =  'publish'
and c.term_id $category
ORDER BY a.id DESC
HERE;
$res = $wpdb->get_results($sql);

$i = 0;
// num, ID, IMG, DATE, TITLE, GUID, CATNAME
foreach ($res as $r) {
	if ($flg) { // 先頭の画像を表示
		preg_match("/src=\"?(".preg_quote(home_url(), "/").".+?\.jpg)/i", $r->post_content, $match);
		if ($match[1]) {
			$buf[$i]["ID"] = $r->ID;
			$buf[$i]["IMG"] = $match[1];
			$buf[$i]["DATE"] = $r->post_date;
			$buf[$i]["TITLE"] = $r->post_title;
			$buf[$i]["CATE"] = $r->name;
			$buf[$i]["GUID"] = $r->guid;
			$i++;
		}
	} else { // すべての画像を表示
		preg_match_all("/src=\"?(".preg_quote(home_url(), "/").".+?\.jpg)/i", $r->post_content, $match);
		if (count($match[1])) {
			foreach ($match[1] as $m) {
				$buf[$i]["ID"] = $r->ID;
				$buf[$i]["IMG"] = $m;
				$buf[$i]["DATE"] = $r->post_date;
				$buf[$i]["TITLE"] = $r->post_title;
				$buf[$i]["CATE"] = $r->name;
				$buf[$i]["GUID"] = $r->guid;
				$i++;
			}
		}
	}
}
$count = $i;

// 画像の数から全ページ数を求める
$page_counts = ceil($count / $per_page);
// URLからページ番号を得る
$page_no = intval($wp_query->get('paged'));
if ($page_no < 1) {
	$page_no = 1;
} else if ($page_no > $page_counts) {
	$page_no = $page_counts;
}
// オフセットを求める
$offset = ($page_no - 1) * $per_page;
// ページ内の先頭と最後の画像の番号を求める
$page_start = ($page_no - 1) * $per_page + 1;
$page_end = $page_no * $per_page;
if ($page_end > $count) {
	$page_end = $count;
}
?>

<h2>既読小説の一覧(<?php echo $count; ?>件中<?php echo $page_start; ?>~<?php echo $page_end; ?>件目)</h2>

<?php
$ctr = 0;

$buf = array_slice($buf, $offset, $per_page);

// 画像を順に出力する
foreach ($buf as $val) :
	// 画像の幅と高さを求める
	$at_data = wp_get_attachment_metadata($post->ID);
	$width = $at_data['width'];
	$height = $at_data['height'];
	if (!$width || !$height) {
		$width = $max_width;
		$height = $max_height;
	}
	// 画像の縦横比を維持したまま、
	// 幅が$max_width/高さが$max_heightに収まるように
	// サイズを計算しなおす
	if ($width > $max_width || $height > $max_height) {
		// 横長の画像の場合
		if ($width / $height >= $max_width / $max_height) {
			$rate = $max_width / $width;
			$width = $max_width;
			$height = $height * $rate;
		} else { // 縦長の画像の場合
			$rate = $max_height / $height;
			$width = $width * $rate;
			$height = $max_height;
		}
	}
	//$title = get_the_title($val[ID]);
?>

<div class="imagebox">
<p><a href="<?php echo $val['GUID']; ?>" class="thickbox">
<img src="<?php echo $val['IMG']; ?>" width="<?php echo $width; ?>" height="<?php echo $height; ?>" alt="<?php echo $val['TITLE'] ?>" />
</a></p>
<span><a href="<?php echo $val['GUID']; ?>"><?php echo $val['TITLE']; ?></a></span>
</div>

<?php endforeach; ?>

<div style="clear:both;"></div>

<?php if ($page_counts > 1) : ?>
<p class="page-list">
<?php if ($page_no != 1) : ?>
	<span class="mark"><a href="<?php echo get_pagenum_link(1); ?>">最初のページ</a></span>
	<span class="mark"><a href="<?php echo get_pagenum_link($page_no - 1); ?>">前のページ</a></span>
<?php endif; ?>
<?php for ($i = 1; $i <= $page_counts; $i++) : ?>
	<?php if ($i == $page_no) : ?>
	<span class="namber now"><?php echo $i; ?></span>
	<?php else : ?>
	<span class="namber"><a href="<?php echo get_pagenum_link($i); ?>"><?php echo $i; ?></a></span>
<?php endif; ?>
<?php endfor; ?>
<?php if ($page_no != $page_counts) : ?>
	<span class="mark"><a href="<?php echo get_pagenum_link($page_no + 1); ?>">次のページ</a></span>
	<span class="mark"><a href="<?php echo get_pagenum_link($page_counts); ?>">最後のページ</a></span>
<?php endif; ?>
</p>
<?php endif; ?>

viva