WordPressで画像やPDFなどをアップロードした際、日本語や記号の含まれたファイル名がそのまま保存されてしまうと、リンク切れや文字化け、SEOへの悪影響が起こる可能性があります。
本記事では、メディアライブラリにアップロードされたファイルの名前を自動でリネームする方法を紹介します。ファイル名を英数字や日付ベースに統一することで、運用効率や安定性が向上します。
アップロード時にファイル名を変更するには?
WordPressにはwp_handle_upload_prefilterというフィルターフックがあり、メディアファイルがアップロード処理される際に$file配列(name・type・tmp_name・size・errorを含む)を受け取り操作できます。これを利用して、リネーム処理を挟み込みます。
よく似た方法として
sanitize_file_nameフィルターを使う解説を見かけますが、これはsanitize_file_name()関数が呼ばれるあらゆる場面で発火するグローバルなフックです。WordPress公式リファレンスで確認したところ、このフィルターはdownload_url()(プラグイン/テーマのZIPダウンロード処理)やFile_Upload_Upgrader(管理画面からのプラグイン/テーマZIPアップロード機能)でも呼ばれます。無条件にファイル名を書き換える処理をここに仕込むと、メディアライブラリの画像だけでなく、プラグインやテーマのZIPファイル名まで意図せず書き換えてしまう危険があります。メディアアップロードだけを対象にしたい場合は、必ずwp_handle_upload_prefilterを使ってください。ファイル名をアップロード日時+拡張子に変換するサンプルコード
以下のコードをfunctions.phpに追加することで、すべてのファイル名をアップロード日時ベースにリネームできます。
function custom_rename_uploaded_file($file) {
// 拡張子を取得
$info = pathinfo($file['name']);
$ext = isset($info['extension']) ? '.' . strtolower($info['extension']) : '';
// 新しいファイル名(例:upload_20240601_153045.jpg)
$file['name'] = 'upload_' . date('Ymd_His') . $ext;
return $file;
}
add_filter('wp_handle_upload_prefilter', 'custom_rename_uploaded_file');
このコードは、元のファイル名を破棄して「upload_年月日時分秒.拡張子」の形式に変換します。
日本語ファイル名だけを変換したい場合
すべてではなく日本語ファイル名のみを変換したい場合は、以下のように正規表現でチェックを追加します。
function rename_only_japanese_filename($file) {
// 日本語を含んでいるか確認
if (preg_match('/[一-龯ぁ-んァ-ヶー]/u', $file['name'])) {
$info = pathinfo($file['name']);
$ext = isset($info['extension']) ? '.' . strtolower($info['extension']) : '';
$file['name'] = 'file_' . date('Ymd_His') . $ext;
}
// 日本語でなければそのまま($fileは変更しない)
return $file;
}
add_filter('wp_handle_upload_prefilter', 'rename_only_japanese_filename');
このコードでは、日本語が含まれているファイル名だけをリネーム対象とし、それ以外はそのままアップロードされます。
アップロードユーザーに応じてリネームする
ユーザーごとにファイルを識別したい場合は、get_current_user_id()を活用できます。
function rename_with_user_id($file) {
$info = pathinfo($file['name']);
$ext = isset($info['extension']) ? '.' . strtolower($info['extension']) : '';
$user_id = get_current_user_id();
$file['name'] = 'user' . $user_id . '_' . date('Ymd_His') . $ext;
return $file;
}
add_filter('wp_handle_upload_prefilter', 'rename_with_user_id');
このようにすれば、「user5_20240601_101500.jpg」のようなファイル名に変更できます。
注意点:リネームの重複対策
同じタイミングで同名ファイルがアップロードされると、上書きや保存エラーの原因になります。確実にユニークなファイル名にしたい場合は、uniqid()関数を使って対応可能です。
$file['name'] = 'file_' . uniqid() . $ext;
もしくは、日付+乱数で構成するのも安全です。
よくある質問(FAQ)
まとめ
WordPressのwp_handle_upload_prefilterフィルターを使えば、メディアアップロード時にだけ安全にファイル名を制御できます。日本語ファイル名の文字化けやSEO対策、ファイル管理のしやすさなど、さまざまな利点があります。
サイトの運用ルールや管理体制に合わせて、最適な命名規則を構築しておくと長期的にトラブルを防げるでしょう。

