はじめに
メディアのアップロード時に、画像ファイル名をタイムスタンプに変更し、ファイル名を統一します。
これにより、元のファイル名に左右されず、一定のルールに基づいたファイル名で画像を管理できます。
WordPressのメディア登録に関する挙動
WordPressでは、アップロードしたファイルは通常、年月別のフォルダに保存されます。
同じ名前のファイルがアップロードされた場合、保存先のディレクトリに同名ファイルが存在するかどうかによって、ファイル名の扱いが変わります。
- 同じフォルダに同一ファイル名が存在する場合
例えば、保存先にimage.jpgがすでに存在する場合、WordPressはファイル名の重複を避けるため、自動的に番号を付けてimage-1.jpgのような名前に変更します。
同じ名前のファイルが複数存在する場合は、既存のファイルと重複しない番号が使用されます。
- 異なるフォルダに同一ファイル名が存在する場合
例えば、年月別のフォルダ分けが有効な環境で、別の月のフォルダにimage.jpgが存在していても、保存先のフォルダが異なれば、通常は同じファイル名のまま保存されます。
このように、WordPressでは保存先のディレクトリを基準にファイル名の重複を判定し、同じ場所に同名ファイルがある場合は、ファイル名を変更して重複を防ぎます。
実装手順
以下のコードをfunctions.phpに追加します。
add_filter('sanitize_file_name', function ($filename) {
$path_info = pathinfo($filename);
// 拡張子を取得
$ext_raw = strtolower($path_info['extension'] ?? '');
$ext = $ext_raw !== '' ? '.' . $ext_raw : '';
// 画像拡張子の判定
if (in_array($ext_raw, ['jpg', 'jpeg', 'png', 'gif'], true)) {
$filename = time() . $ext;
}
return $filename;
});
補足
このコードでは、JPEG、PNG、GIF形式の画像ファイルを対象に、ファイル名をタイムスタンプに変更します。
例えば、image.jpgは 1792479600.jpgのようなファイル名になります。
ただし、time()は秒単位の値を返すため、同じ秒内に複数の画像をアップロードすると、同じファイル名になる可能性があります。
その場合、保存先に同名ファイルが存在すれば、WordPressの標準機能によって枝番が付与されます。
注意点
セキュリティ系プラグインの「SiteGuard WP Plugin」を使用している場合は注意が必要です。
同プラグインでは、設定によってCAPTCHA画像が使用されます。
本コードがその画像のファイル名処理にも適用され、生成時に想定されたファイル名と参照先のファイル名が一致しなくなると、画像が表示されなくなる可能性があります。
さいごに
今回紹介した方法を使用すれば、画像のアップロード時にファイル名をタイムスタンプへ自動的に変更し、統一した形式で管理できます。
元のファイル名が異なる画像でも、同じルールでファイル名を付けられるため、メディアを整理しやすくなります。
