WordPressの添付ファイル専用ページで、大きな画像もオリジナルサイズで表示する方法について調べました。WordPressのコアに手を入れる必要があるようですので、ご紹介します。追記あり:2.2.1では、テーマファイルattachment.phpの記述だけでサイズを制御出来ました。
問題の概要
添付ファイル専用ページについて
WordPressの「アップロード」機能を使うと、画像等のファイルをブログにアップロード出来ます。縮小サイズの画像(サムネイル)を自動で作成するなど、多機能ではありませんが標準的なところを押さえている機能です。表示方法(サムネイル・フルサイズ・タイトル)とリンク先(ファイル・ページ・なし)を選んで投稿内容に挿入出来ます。
ここで、リンク先を「ページ」とした場合には、attachment.php(なければindex.php)により、アップロードしたファイル専用のページ(以後、「添付ファイル専用ページ」と呼称します)を作成出来、投稿したページ中のサムネイルかフルサイズ画像かタイトルから、当該専用ページにリンクを張ることが出来ます。
寸法を自動調整する機能の存在
しかし、困ったことに、添付ファイル専用ページの画像が意図せずに縮小されてしまうという親切ないしお節介な機能があります。先のエントリではこの仕様に悩まされました。
閲覧者の立場からみると、オリジナルサイズ(元の解像度)の元画像に到達するまでには、以下のような手順を踏む必要があり、とても面倒です。
- 元ページ …… 投稿したエントリのページ。サムネイルが表示されている。サムネイルのリンクをクリック可能。
- 専用ページ …… 画像専用のページ。縮小画像が表示されている。縮小画像のリンクをクリック可能。
- 画像 …… 画像そのもののURL。オリジナルサイズで表示される(IE等のお節介機能があれば、さらにもう一段階手間が掛かります)。
テーマ側(attachment.phpやindex.php)にてこの仕様を変更できないものかとも考えましたが、どうも駄目そうでした。そこで、この機能自体を殺してしまうことにしました。具体的な方法は、以下の通りです。
機能を封印する方法
post-template.phpを修正する
※追記:この項の記述は推奨しません。後述の「結局、テーマattachment.phpで指定出来る」をご参照ください。
実際には、専用ページに於いて表示される(つまり、img要素のsrc属性に指定されているURLの)縮小画像は、元画像そのものです。(容量という意味ではなく寸法という意味の)サイズが大きい場合に、width属性またはheight属性が指定値として記述されてしまいます。
調べた結果、このwidthまたはheightを挿入する機能は、WordPress ME 2.2.1では、wp-includes/post-template.phpの393行目から始まる”get_attachment_icon”関数が提供していることが判りました。そこで、この記述を変更してしまいましょう。
具体的な変更点は、以下の通りです。
- 414行目
$constraint = "width='{$max_dims[0]}’ “;全体をコメントアウト - 418行目
$constraint = "height='{$max_dims[1]}’ “;全体をコメントアウト - 428行目の「
$constraint」の部分を削除
これで、意図した通りの添付ファイル専用ページが実現出来ます。稼働例として、先のエントリを親ポストに持つ専用ページを挙げておきます。
添付ファイルの扱い
ファイル自体の画像サイズ等は、アップロード時にデータベースに記載されるようです。具体的には、使用しているデータベースのwp_postmetaテーブルに2レコードが記載されます。meta_keyが_wp_attachment_metadataとなっているレコードに、longtextとして文字列で元画像のheightやらサムネイルのwidthやらが格納されています(meta_keyが_wp_attached_fileとなっているレコードでは、meta_valueに添付ファイルのURLが記載されます)。
このブログはMySQLで運用していますが、PostgreSQL等でも一緒と思われます。
いっそここのwidthやらheightやらを(後からSQLを投げて)変えてしまう手もありますが、流石に怖いのでまだ試してはいません。
その他の回避策
残念ながら、あまり深く追っていないので、これ以上の調査結果は今のところ持ち合わせていません。例えば、最大寸法の指定値はmax_dims配列に入っているので、これ自体を(大きな値に)変更する手もありそうです。また、画像であればリンクを設けない(a要素を外す)という手もありそうです。
なお、別途プラグインを導入し、アップロード時に画像自体を自動で編集して、縦横を縮小するリサイズを行うという選択肢もあります。
サムネイルのリンク先を(添付ファイル専用ページではなく)素直に当該ファイルそのものにする手もありますし、むしろ世間的にはこの方が一般的かも知れません。画像の概要等を突っ込んで書こうと思ったりする場合には、やはり専用ページという機能は捨てがたく感じます。この辺りは好き好きだと思います。
その他の回避策についてもしご存じの方がいらっしゃったら、お教えいただければ幸いです。
追記:結局、テーマattachment.phpで指定出来る
どうにも気になったので、もう少し深く追ってみました。post-template.phpのget_the_attachment_link関数が、リンク(a要素)付きの画像(等の添付ファイル)のHTMLコードを生成するようです。これの第三引数$max_dimsを指定すると、サムネイルサイズを指定出来る様子です。wp-content/themes/default/attachment.phpでは、しっかりとarray(450, 800)を渡しているようなので、この値をfalseにしてみました。すると、確かにオリジナルサイズで表示されます。
attachment.phpでget_the_attachment_linkを呼ぶ際には、第三引数を以下のようにすると良いでしょう。
- オリジナルサイズで表示する場合には、
falseにする。array(横px, 縦px)を巨大な値にしても良いが、無駄な処理が走るので推奨しない。 - サムネイルサイズを指定する場合には、
array(横px, 縦px)を記述する。
結局、コアに手を入れることなく、テーマファイルだけでどうにかなりました。WordPressもPHPも扱い慣れていませんでしたが、盆休みで落ち着いて中身を覗いてみて良かったです。
添付ファイル専用ページのその他の悩み事
添付ファイル専用ページから親ページ(元の投稿ページ)へ戻る方法は、残念ながら履歴を辿るしかありません。これは当然のことで、添付ファイル専用ページも普通の投稿ページと同様に扱われるためで、添付ファイル専用ページは親を二つ以上持てる仕組みになっているからです。
履歴となるとhistory.backするしかないので、JavaScriptが生きていない環境では意味がありません。
運用で何とかする場合には、添付ファイル専用ページの親を一つに限定する方法があります。これならば、previous_post_linkというWordPressタグを用いることで、添付ファイルをアップロードしたページに戻ることが出来ます。ただし、これも困ったことに、<!--nextpage-->でページを分割した場合までは反映されません。
添付ファイル専用ページでは投稿スラッグがないので、ファイルのタイトルを日本語(2バイト文字)で付けると、エンコードされた文字列がパーマリンクになってしまいます。これについてはMiyoshi氏のtam-attachmentというプラグインがまさにうってつけなのですが、どうも2.1系以降で稼働しないようで、残念でした。