WordPressのトップページで投稿に添付された画像をランダム表示する

わざわざタイトルに WordPress って書くとこがヤラシイわ。フォーラム「random imageを使ってのページへの画像貼り付け」のネタです。トップ(ホーム)ページに、今まで投稿した記事に添付してある画像をいくつかランダムにピックアップして表示したい、そんな要求は結構あるようです。個人ブログに。
で、そのようなプラグインがいくつかあって、ソレを試そうとして大変なご苦労をされている方が結構いらっしゃるようです。そのプラグイン、苦労に見合う価値があると思いますか?プラグインなんてタイソウなこと言ってますけど、数行でできるようなモノがほとんどです。自分にピッタリなモノもそうそうないのでカスタマイズしようとするとハマってしまう。それならいっそ functions.php に自分でコードを書きましょう!コッチはすごく楽しいですよ。

基本方針

日本 WPist 協会の皆さんにはぜひこのポリシーといいますかフィロソフィーといいますか、ブレない考え方を心の拠り所として日々の業務に邁進していただきたいと思います。

  1. 安易にプラグインに頼らない。
    • 考える力を削がれます。
    • 期待に応えてはくれません。
    • かえってメンドクサイことになります。
  2. 安易にプラグインを作らない。
    • その必要がありますか。
    • ありませんよね。
    • 技術的興味、変態的趣味だけなら OK です。
  3. 安易にプラグインを配布しない。
    • 利用する人がどれだけ期待しているか考えよう。
    • えええええぇー、という問い合わせにも真摯にサポートする覚悟が必要です。
    • 一度流出してしまった恥ずかしい過去は消すことができません。

非プラ3原則、忘れないように。もちろん、自分でイチから作るにはアレで完成度の高いプラグインがある場合は積極的に利用して構いません。だってそれが WordPress だもの。では本題に入ります。

画像をランダムに取得する

画像と言っても WordPress では投稿/ページと基本的に同じ扱いなので何も難しいことはありません。普段は query_posts() 推奨派の kz ですが、今回は get_posts を使います。何故かって?今回はソッチのが楽チンだからさ。何故ソッチのが楽チンかって?両方試せばわかるぜ。反射的に尋ねる前にまずやってみよう。

get_posts() がリファレンスを返す関数になっているのは何のためなんでしょうか。ご存知の方はお知らせください。パフォーマンスの向上 だけなんてことはないよね!WordPress だもの。

get_posts にやってもらう仕事は、

  • 指定数の画像を取得する。
  • 順番はランダムでお願いしたい。

あれ、こんだけやん。じゃぁ早速描いてみよう!Let's draw the code!

function my_random_images($count=1, $size='thumbnail'){
  $args = array(
    'showposts' => $count, 
    'post_type' => 'attachment',
    'post_mime_type' => 'image',
    'orderby' => 'rand',
  );
  
  $images = get_posts($args);
  echo '<div class="my-images">';
  foreach($images as $image)
    echo wp_get_attachment_image($image->ID, $size); // thumbnail|medium|large|full|array(width, height)
  echo '</div>';
}

以上を functions.php に追加して、画像を表示したい箇所に

<?php my_random_images(3); ?>

などと書けば良い。タイトルには「トップページで」とあるがこれは単に SEO 的なアレなので気にすんな。常識の範囲内でどこに書いても OK。レイアウトは css に任せておこう。
それでは実質5行の my_random_images の中身を説明しよう。これだけで実現できるものをプラグインに振り回されていたなんて切な過ぎるぜ。でも、プラグインを責めても同じことの繰り返しさ。まず自分が変わることが大切なんだ。
画像数の指定は showposts で OK。それは deplicated だから posts_per_page を使いなと言いたいところだが、今回はなんだか指定数取得をしてくれなかったので showposts で OK なのだ。眠いから追求しないでおいてやる。皆にとってはこれはチャンスだ。ここをサラッと読み流して寝てしまうか、検証コードを書いてソースを調べ出すかで、十年後の未来は大きく変わるだろう。前者は羽振りの良い経営者、後者は地味なエンジニアだ。
ところで Codex Function Reference/get posts にコレの記載がないのはなんでだろうね。秘密にしておきたかったならゴメン。
次に、順番をランダムにするには orderby=rand で OK。えーっ、こんだけなの?!共学の私立!はもういいですか。SQL に元からあるわ Codex にも載ってるわで何も驚くようなことはありません。
あとは $imagesテーブルから持ってきた情報 が入ってるので自由に使えばよろしい。wp_get_attachment_image は指定画像の img タグを作ってくれる。サイズも自在に指定できるので Codex を参照して色々試してみよう。画像のリサイズなんてわざわざ timthumb.php を使わんでもできるのだ、さすが WordPress。

タイトルには「投稿に添付された」とありますが、my_random_images は[メディア|ライブラリ]の全画像を対象にします。つまり投稿やページにリンクされていない内緒の画像も構わず表示するので、恥ずかしい写真などをアップロードしている方は気をつけてください。

ここでクレバーなキミにはちょっと気になることがあるだろう。そう、'post_mime_type' => 'image' だ。
MIME タイプはデータベースには image/png, image/jpeg という文字列で格納されてるんだからマッチしないんじゃないの?
ー 実は WordPress には SQL 作成のための便利関数があって MIME タイプ の指定でもそれを利用している。

wp_post_mime_type_where('image')
 ー これは AND (post_mime_type LIKE 'image/%')  を返します。
   つまり image/png, image/jpeg などの image/なんとか にバッチリマッチします。

wp_post_mime_type_where の中身は何もそこまでと思うほどクレイジーな実装になっている。だが、ここまでやれる思慮深さ、あるいは執念深さを持つ人のみが他人が利用するものを提供できるとも言える。興味のある方は wp-includes/post.php の 1120行目から読んでみると良い。将来は間違いなく地味なエンジニアだ。

動作確認バージョン
  • WordPress 2.9.1
参照

3 Comments

  • WordPressのトップページで投稿に添付された画像をランダム表示する http://t.co/7KaB8qnA via @AddToAny 文章が面白すぎてお腹痛いですww

  • メモ http://t.co/dra0pYJX