WordPress get_children()で投稿内の画像情報を取得する

WordPressの投稿内の画像情報の取得方法についてです。
サムネイル表示したり、URLを取得したり、というのが主な用途になるかと思います。

これ、いつも思うんですけど意外に面倒くさい。
そして、いつも「どうやったんだっけ?」と調べなおす効率の悪さ。

アイキャッチ画像(投稿サムネイル)関連情報の取得であれば、the_post_thumbnailなどのテンプレートタグが用意されていますが、個人的にはアイキャッチ画像をほとんど使っていないもので…。

スマートな方法はないものかと調べてみると、ヒットするのは、get_the_contentで記事本文を取得し、正規表現でその中からimg要素にマッチした部分を抜き取るやり方が目立ちます。私的にはスマートな感じがしないので、Wordpress関数を使った方法にこだわりたいと思います。

使うのは、get_children

//投稿IDを取得(状況に合わせてIDの取得方法は変えてください)
global $post;
$post_id = $post->ID;

//投稿中のすべての添付データの情報をオブジェクト形式(デフォルト)で取得
$attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment') );

//以下のように書いても同じ結果を取得できます
$attachments = get_children( 'post_parent='.$post_id.'&post_type=attachment') );

$attachmentsをダンプしてみるとわかりますが、この中に様々な情報が含まれております。
例えば最初の一枚目の画像のタイトルとURLを取得したい場合は、以下のようになります。

//画像タイトル取得
$title = $attachments[0]->post_title;
//画像URL取得
$url = $attachments[0]->guid;

端っから最初の1枚しか用がないのであれば、get_childrenのパラメータ「numberposts」に「1」、「order」に「ASC」(昇順)を設定すればいいですね。

//パラメータ : numberposts=1 (1件取得)
//パラメータ : order=ASC (昇順)
$attachments = get_children( 'post_parent='.$post_id.'&post_type=attachment&numberposts=1&order=ASC') );

ただこの「最初の1枚」というのが曲者だったりします。並び順(order)を昇順(ASC)にするのは、おそらく大方の場合は最初に登録したもの(つまり古いもの)が1枚目にくるだろうという想定に基づいています。なので、画像のアップロード順と見た目の並び順が違う場合や画像を一度削除してアップロードしなおした場合などは、並び順を昇順にしても狙った画像情報が得られない可能性があります。ご注意ください。
間違いなく一番目の画像を取得したいのであれば、やはりget_the_contentからimg要素を抜き出す方法になるのでしょうか…。

ge_childrenのパラメータなどの詳細情報はこちらをご確認ください。
関数リファレンス/get children – WordPress Codex 日本語版
get_children:WordPress私的マニュアル

Wordpress, 備忘録 |