WordPressでブログとかを書くとき、画像をアップロードすることってあるよね。

そのとき、ファイル名はどうしてる?

どうって……そもそも変えられないし……

そう! WordPressでファイルをアップロードするとき、ファイル名はPCに保存されてる通りになり、変えられないのだ!

変なファイル名にしてると、公開情報だから、恥ずかしいんだぞ。

ということで、アップロード時に自動で、ランダムな文字列のファイル名を付けてくれたらうれしいんだけど……

というのを今回はやってみる。

プラグインを使う

ランダムな文字列といえばハッシュ値。

ということでプラグインを探してみると、「MD5」というハッシュ関数を使ってファイルをリネームするプラグインを発見。

WordPress › MD5 Media Renamer - WordPress Plugins

MD5とは、簡単に言うとあらゆるデータを128ビット(32桁の16進数)の暗号に変換するハッシュ関数であり、データの無改竄性を証明するなどに使われているが、ここでは単にランダムかつユニークなファイル名を生成するのに使う。

MD5 - Wikipedia

ということで、さっそくこのプラグインを……

と思ったが、実はこのプラグインは古く、最新バージョンのWordPressでは動作しないようだ。

テーマ関数でやってみる

このプラグインは諦めるとして、調べても他にいい感じの方法が見つからなかったので、このプラグインのソースを見てみる。

すると、 sanitize_file_name というフックにフィルターしているのを発見。

プラグインの中身を見て弄るのには慣れてなかったんだけど、俺でも意外とわかったなぁと。

ということで、プラグインのファイルの該当部分をテーマ関数(functions.php)にコピペ。

ついでに俺が独自に調整したのが以下のソースだ。

function rename_file_md5($fileName) {
    $i = strrpos($fileName, '.');
    if ($i) $Exts = '.'.substr($fileName, $i + 1);
    else $Exts = '';
    $fileName = md5(time().$fileName).$Exts;
    return strtolower($fileName);
}
add_filter('sanitize_file_name', 'rename_file_md5', 10);

処理としては、まずファイル名の拡張子部分を抜き出して $Exts に格納。

そして、現在のUNIX時刻と元のファイル名からMD5ハッシュ値を生成(赤字の部分)して新たなファイル名にする。

UNIX時刻と元のファイル名の両方を使う理由は、MD5関数は同じデータに対していつも同じハッシュ値を返すからだ(ハッシュ関数だから当然だが)。

UNIX時刻だけだと同時にアップロードした別のファイルと同じになるし、元のファイル名だけだと同名ファイルと同じになってしまうわけだ。

最後の行はフィルターフック sanitize_file_name に1〜7行目で定義した関数 rename_file_md5 をフックしているが、このような書き方はテーマ関数でよく使うので覚えておこう。

終わりに

ファイル名をリネームできるプラグインもあるが、ファイル名なんていちいち付けたくないって人におすすめの今回の方法。

プラグインも使わないし、たった8行で実現できるとは。

ファイル名は32文字と長くなるが、ランダム感が好きな人はぜひお試しを。