画像一覧ページ
この記事は公開または最後に更新されてから538日が経過しています。情報が古くなっている可能性があるのでご注意下さい。
画像サイトに画像一覧ページはつきものです。
無いと困るというものでもありませんが、やはり一覧表示できれば便利ですから欲しいと思います。
画像一覧ページに関しては、この本の「画像一覧のページを作る」の項目を基本的にほぼそのまま利用させていただきました。
データベースに直接アクセスする方法をはじめとして、多くのことを学ぶことができた本です。とてもお世話になりました。
自分のページにあわせて改良した点はといえば、読み込む画像の数が多いのでミドルサイズを読み込むように変更しました。
画像のアドレス/概要/タイトルを得る の部分です。
7~8行目が追加した分。
wp_get_attachment_image_src($post->ID,'medium') で画像のpostのIDを指定し medium サイズの画像の情報を得ます。
この場合の情報は配列にて返され、
- [0]=>url
- [1]=>width
- [2]=>height
と、なっています。
そして実際に画像を出力するところの <img src="<?php echo $url; ?> の部分の $url を $urlmini に置き換えています。
このページでも画像をクリックした時の拡大表示の処理はここの前のページ画像をクリックした時のログで修正をくわえた showpop 関数を使用しています。
・・・
※ 2020/3/16 追記
この記事を書いてから(画像一覧ページを初めて作ったときからという方がいいのか)、随分と改良を重ねてもともとのものからはかなり違ったものになっていたりする。どういうやり方が良いのだろうかといろいろと試したみたことの備忘録。どこかに残しておかないとまちがいなく忘れてしまうので。
SQL の処理速度を考えるなら、取得する項目を少なくする、検索する条件を少なくする、関連づけるテーブルを少なくする、といったことを吟味する必要がある。例えば、教本においては、画像のデータが入っているwp_posts テーブルの、その画像のデータはすべて取得しているのだけれど、自分の場合であれば必要なものは、画像データのIDとその親投稿のID ( post_parent )だけ。メディアとしてアップロードしているのは画像のみだとしたら、post_mime_type LIKE 'image/%' の条件はいらない。
であればそのSQL はこんな具合になる。
そして画像を順に書き出す処理となる。
レイアウトにテーブルを使うなんてことは昔話。
25行目から28行目で、ミディアムサイズの画像の情報を取得するのに、その一例としてget_post_meta() を使う方法もあると。
get_post_meta() といえば、カスタムフィールドの値を取得するときに使うやつね。画像のサムネイルなんかの情報というのは、post ID で関連づけられてwp_postmeta テーブルに保存されている。して、そのkey は、'_wp_attachment_metadata' 。ゆえにその値は、get_post_meta() で取得することができるわけです。
配列で返されるその値は、例えば下のようになってるので必要な値を使えば良いということ。
というか、当然のこと、この値を得るための関数がちゃんとあったりして。それが、wp_get_attachment_metadata() 。
まぁ、サイズを指定せずに画像のデータがほしいときはこの関数を使えばいいってことでした。あはっ!
で、こういうことを考えていて、ふと、気がついたのは、ならばいっそのこと画像の情報をSQL で取得するときに一緒に画像のmeta 情報も取得してしまえばよいのでは!ってこと。
こんな具合に!
まぁ、予想通り、テーブルが増えて条件も増えるので結果はかなり遅くなる。画像のデータが128366個ある状況では、meta_value 無しで0.5615秒、有りで1.6246秒という結果。ただ、実際に1ページに表示する画像の数は100もないだろうし、html を書き出す段階で画像の情報を取得するためのデータベースアクセスがなくなることを考えると、どっちかな?という感じはする。
ただし、この場合のmeta_value の値はデータベースの値そのままでシリアライズされた値となっているので、もうひと手間必要となる。そのシリアライズされた値というのはvar_dump すると下のようになってる。
と、いうことでこの値はデシリアライズして使うことになる。
画像情報を処理する部分だけを書き出すと下のよう。
5行目でデシリアライズした値を配列にて受け取ってる。
教本のもともとのやり方だと、まず画像の数を得てからオフセットを計算して、そのページに表示するのに必要な数の画像データを取得するという方法。まぁ、それが理屈にあったまっとうな方法だとは思う。そうじゃなくてもいいのなら、もしかすると少しでも速くなるかも?という手も試してみるのもいい。そもそもの画像の数がしれた数しかないのであれば、いきなりのSQLですべての画像のデータで必要な項目だけ取得してしまうという方法もありなのではなかろうか。それならSQL 発行も一度ですむ。あとはオフセットを求めて、1ページに表示する画像数で配列を使用する部分だけarray_slice() で抜き取って、不必要な部分は開放、というのはどうだろう。
で、あるカテゴリーだけの画像を表示するページで下のように使用してる。
ちなみに、カテゴリーやタグで投稿を絞り込む場合、name や slug ではなく、そのターム(タクソノミー)ID を使えば、wp_terms テーブルは不必要となるので、テーブルを一つ減らす事ができる。
Post : 2012/05/18 12:57
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=16232