定番ブログエンジンの「WordPress」では、編集画面に画像などのファイルをドロップして手軽にアップロード可能だ。自動的に縮小版が生成され、拡大版画像を表示するためのページも用意される。
拡大版画像ページのURLに使われるスラグ(識別名)は、画像のEXIFデータや元ファイル名から生成されるが、日本語を含む名前のファイルだと日本語を含むURLになってしまうのが困りものだ。「%E3%81%AE」のようにエンコードされた状態だと長ったらしくて格好悪いし、エンコード済みのURLがプログラムのバグで二重にエンコードされてアクセス出来なくなるなどの問題を引き起こすこともある。
日本語を含むURLを避けたければ、日本語を含まないファイル名に変更してからアップロードすればいいだけの話ではあるが、多数の画像を扱う場合には面倒だ。
そこで、テーマディレクトリの「functions.php」にフィルタ処理を記述して、スラグの生成処理を書き換えてしまおう。アップロードされた画像の情報を保存する直前に呼び出される「wp_insert_attachment_data」のフィルタに関数を登録すればいいぞ。
日本語を含む名前のファイルをアップロードすると、画像を識別するためのスラグが日本語になってしまい、拡大画像ページのURLが日本語を含むURLになってしまう。
HTMLに埋め込まれるときなどは、「%E3%81%AE」のようなエンコードされた形になるが、無駄に長くて格好悪いし、エンコードがらみの不具合を引き起こすこともある。
function prevent_multibyte_attachment_name($data,$id){ if(!preg_match( '@^[\\w\\-]+$@sui',$data['post_name'])){ $data['post_name']=preg_replace('@^.*/(.*)\\.\\w+$@i','$1',$data['guid']); } return($data); } add_filter('wp_insert_attachment_data','prevent_multibyte_attachment_name',10,2);
画像のスラグ生成方法を変更したければ、テーマディレクトリの「functions.php」に上記のような処理を追加しよう。
この例では、フルサイズ版の画像ファイルのURLが格納されている「$data['guid']」から抜き出したファイル名をセットしている。
ファイル本体の名前の方は、日本語などが含まれていると英数字だけのランダムな名前に変更されるようになっているのだ。
「$data['post_title']」を変更すれば、拡大版画像ページのタイトルなどに表示されるタイトルも変更できるが、こちらは元の日本語の名前の方がいいだろう。
これで日本語を含むURLが出来てしまうのを防止できるぞ。