技術

wp_get_attachment_imageでalt属性を出力できるようにした

WordPressには、wp_get_attachment_imageとwp_get_attachment_image_srcという関数(テンプレートタグ)があります。
これらの関数は、引数にブログに登録された画像ファイルのIDと表示サイズを渡し、その情報を取得することができます。
wp_get_attachment_image_srcは、戻り値として画像のURLと縦横のサイズを配列にしたものを返します。
wp_get_attachment_imageは、その関数内部でwp_get_attachment_image_srcを利用し、戻り値として画像を表示するためのHTMLタグを文字列として返します。

これらの関数は記事の枠組みにとらわれず、画像を表示し管理したい場合に役に立つのですが、SEO的に必須とも言えるようなimgタグのalt属性に対応していません。
Wordpressの管理画面では画像ファイルに”キャプション”と”説明”というalt属性として使えそうな項目を関連付けられるのにも関わらず、それらがあまり生かされていないのは勿体無いと言う外ありません。

そこで、今回は管理画面で言うところの画像の”キャプション”を”alt属性”として出力できるようなプラグインを作成してみました。
名前は、wp_get_attachment_image_complete。センスのかけらもないネーミングですね。
プラグインファイルはここからダウンロードできます。

使い方

ダウンロードして解凍し、Wordpressのプラグインフォルダに入れて、管理画面から有効にします。
そうするとテンプレートでwp_get_attachment_image_completeとwp_get_attachment_image_src_completeの2つのテンプレートタグが利用可能になります。
元々のテンプレートタグと互換性を持たせてあるので、そのまま置き換えるだけ(同じ使い方)で問題ないハズです。
wp_get_attachment_image_completeは特に何もしなくてもalt属性を出力します。
wp_get_attachment_image_src_completeは、戻り値の配列の4番目と5番目、つまり$imgに格納したとして$img[3]と$img[4]がそれぞれ”キャプション”と”説明”に対応します。

あとがき、言い訳

本当は、wp_get_attachment_imageから呼び出されるwp_get_attachment_metadataにフックをかけるのがスマートだと思うのですが、そうした場合に何故かpost idがプラグインの関数側で取得できないという問題が起き、それを解決するためにwp-includes内の関数に手を加える以外の方法を思いつかなかったので、違う関数名で定義することにしました。
バージョンアップが頻繁なWordpressですから、wp-includes内の関数に手を加えたのを忘れて新しいバージョンを上書きすると面倒なことになりますからね。

もしかしたら、同じ機能を持つもっと良いプラグインが他に実在するかもしれません。
ただ、ちょっと調べた感じでは無さそうだったので作ってみました。
というかそもそも、元のwp_get_attachment_image自体があまり利用されてない気がする・・・
このブログでも使ってないしw

あと、元のソースをベースになるべく時間をかけずに改造したので汚くなってます。
1から自分で書けば、まるで清廉なポエムを読んでるような気分になるくらい美しいソースになるんですが。ウソです。ドキドキです。

ライセンスはWordpressのソースを流用してるので一応GNU GPLってことにしておきます。コピーレフトコピーレフト。

post idがプラグインの関数側で取得できない問題について

今回公開したプラグインはこの問題を避けているので関係ないのですが、気になったので記録しておきます。
といっても、きちんと調べて説明するのが面倒なので箇条書き風です。
func_get_args関数には魔物が潜んでるのかもしれない。

wp_get_attachment_metadata関数内部
return apply_filters( ‘wp_get_attachment_metadata’, $data, $post->ID );
ここでは$dataに画像の基本的な情報(src,width,height)とEXIFデータが格納されてて、$post->IDには画像のID(WordPressは記事も画像データも同じテーブルに入ってるため、$image->IDとかじゃなくて$post->IDになる)が入ってる。画像のキャプションと説明はpostテーブルに入ってるためそれらを取得するには$post->ID超重要。

apply_filters関数内部
$args = func_get_args();
何故かprint_r($args)で$post->IDで渡されたものが出てこない。
しかし$args[2]と直接指定すると見える。
最終的にcall_user_func_arrayでプラグインの関数が呼び出される訳ですが、
プラグインの関数内ではもう完全に$post->IDで渡されたはずのデータが見れなくなってる。

コメント

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください