get_children()で投稿にアップロードした画像を全て表示
投稿にはアップロードしたものの記事には挿入していない画像を、たとえば、単一記事テンプレート single.php 等で表示させたい場合など、それらの画像情報を取得するには・・・。
get_children() と wp_get_attachment_image_src()
get_children() を使ってその投稿にアップロードしてある全ての画像の情報を取得。
ループのなかで使用するときの一例。
ちなみに、 wp_get_attachment_image_src() は配列にて返され、
- [0]=>url
- [1]=>width
- [2]=>height
と、なっています。
$attachment->post_excerpt では、画像に設定した caption の文字列を取得することができます。ただ、通常の記事のなかで caption を表示する場合は、このサイトで実際に表示されている部分を見てみると、画像自体を'class="wp-caption aligncenter"' の<div></div>の中に入れ、 caption の文字列も同じ div の中で、 'class="wp-caption-text"' の<p></p>に入っています。
全く同じように再現する必要も無いようにに思いますので、ここはちょっと異なりますが独自の class を付けてスタイルを設定するようにしています。
19~26行目は画像を全て表示した後、記事の本文を表示しています。
記事の本文は get_the_content()関数 で得る事が出来、フィルターを通す必要があるので23、24行目はお決まりのパターンです。
20~22行目がこのサイト独自の本文を改良している処理になります。
20、21行目は記事の本文中に特定の画像だけ表示するようにしているので、それらの画像がダブって表示されないようにするための、画像以外の部分だけにする処理です。
ここの場合、いくつかの画像を表示するコードの後に、必要なら本文を入れているので画像に対するアンカータグの後の部分だけを取得しています。
wordpress のバージョン 3.4 から caption で指定した文字列も本文に表示されるようになってしまったようなので、 caption を一時的に入れておく配列 $capstr に14行目で取得し、22行目で本文から消しています。
・・・2021/7/15 : 追記
ここからは、より速い処理をねらって、自サイトにおいて施しているもの。直にデータベースからデータを取得しているので、そのあたりの知識やら経験やらが無いなら、手を出すべき方法ではありません。念の為。
データベースから一括して情報を取得
アップロードされた画像は、投稿と同じように wp-posts テーブルにそれに関するデータが蓄えられています。post_type が、投稿であれば”post” や ”page” などで、画像の場合はそれが”attachment” になります。
その画像レコードの post_parent の値が、親投稿レコードの ID の値と同じになっていて紐付けられているというわけです。
そして画像にキャプションがついている場合は、その画像レコードの post_excerpt のフィールドに、キャプションの文字列が入ってます。
で、画像に関してのデータは、wp-postmeta テーブルにもあって、このテーブルの画像に関するデータは、post_id がその画像レコードの ID と紐付けられています。そして meta_key フィールドの値が ”_wp_attachment_metadata” に、その画像のサムネイルの情報など含めてシリアライズされて保存されています。なのでそのデータを使うときにはデシリアライズして使うことになり、以下の如くになっています。
見ればわかるように、元ファイルからサムネイルまで必要な情報はキャプション文字列以外、全て揃っています。
と、いうことで、データベースから取得すればいいのは、この値と、あとは wp-posts テーブルにあるその画像のレコードが持っている post_excerpt の値ということになりますね。
それでは、さっそくその SQL をと。
6行目の "a.post_mime_type" の行に関しては、取得する情報のメディアを画像ファイルに限定するもので、動画やら他のメディアをアップしていないのが確かであれば、この行は必要なし。指定する条件が少ないほうが処理はより高速になる。
そしてhtml 吐き出し部分は下に続く。
なお、下のコードは自サイトに使っているものから不必要な部分を削除して、それにともなって必要かと思われる部分を付け足したもので、実際に動かしてみたものではなく、もしかするとどこか問題があるかもしれないので、参考程度にしてくださいまし。
以上です。では、では。
Post : 2012/05/19 22:23
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=16291