wp_get_attachment_metadataではメディアのcaptionを取得できない
いきなりですが、wp_get_attachment_metadataではcaptionが取得できないみたいです。
WordPressのギャラリー機能を使って画像とキャプションを出力したくて、便利そうなwp_get_attachment_metadataという関数を見つけたので、使ってみたところcaptionの値が取得できませんでした。
想定では、
1 2 3 | $metadata = wp_get_attachment_metadata( $id ); $caption = $metadata['image_meta']['caption']; ※$idはメディアのid |
で、キャプションが取得できると思っていたのですが、、、。
var_dumpしても中身は空っぽ。思っていた機能と違うのだろうか?
get_postでcaptionを取得する方法
ネットで調べても明確な答えは出せず。代わりにget_postを使う方法が紹介されていた。
1 2 3 | $postdata = get_post($id); $caption = $postdata->post_excerpt; ※$idはメディアのid |
たしかに画像に設定したキャプションを取得できた。
では、これを応用して、wp_get_attachment_metadataでcaptionの値を取得する方法は?
wp_get_attachment_metadataでメディアのcaptionを取得する方法
やっと本題です。
functions.phpに以下のコードを書いておけば、wp_get_attachment_metadataで取得した値にキャプションが設定されるようになります。
1 2 3 4 5 6 7 8 9 10 11 | /*------------------------------------------- メディアのキャプションを設定する ---------------------------------------------*/ add_filter( 'wp_get_attachment_metadata', 'my_wp_get_attachment_metadata', 10, 2 ); function my_wp_get_attachment_metadata( $data, $id ) { $image = get_post($id); if(is_array($data)) { $data['image_meta']['caption'] = $image->post_excerpt; } return $data; } |
※配列かどうかチェックしないと、「Uncaught Error: Cannot use string offset as an array」エラーが出るので7行目に「if(is_array($data)) {」を追記。
コードの解説(備忘録)
・4行目
wp_get_attachment_metadata関数のソースコードを見てみると、関数の最後に「return apply_filters( ‘wp_get_attachment_metadata’, $data, $post->ID );」というコードがあります。
このコードはフィルターフックの関数の戻り値をそのままreturnしているので、フィルターフック関数を定義して$dataの中のcaptionに適切な値を設定してあげれば良いわけです。
・5~11行目
フィルターフック関数です。
6行目で、上述したget_postでcaptionを取得する方法を使い、8行目でそのキャプションの値を$dataのcaptionに代入しています。
これで呼び出し側は冒頭に書いたコードでキャプションを取得できるようになります。
わざわざget_postを使わなくても済むので、少しコードがスッキリしますね。
おさらい
functions.phpに以下のコードを追加
1 2 3 4 5 6 7 8 9 10 11 | /*------------------------------------------- メディアのキャプションを設定する ---------------------------------------------*/ add_filter( 'wp_get_attachment_metadata', 'my_wp_get_attachment_metadata', 10, 2 ); function my_wp_get_attachment_metadata( $data, $id ) { $image = get_post($id); if(is_array($data)) { $data['image_meta']['caption'] = $image->post_excerpt; } return $data; } |
使用方法(キャプションを変数に代入)
1 2 3 | $metadata = wp_get_attachment_metadata( $id ); $caption = $metadata['image_meta']['caption']; ※$idはメディアのid |