アップロード画像のファイル名変更
Image by Gerd Altmann from Pixabay
2023.03.04(更新日:2023.03.04)
Wordpressってすでにアップロードされたファイル名と同じものをアップすると枝番で区別してくれる。
日本語名でも「WP Multibyte Patch」を入れておけば適当なアルファベット自動変換される。
ただ出来れば整理しやすい命名をしたい。メディアライブラリでも把握しやすくしたい・・・と言うお話。
この記事は1年以上経過しています。内容的に古い場合があります。
好き勝手なファイル名からの脱却
例えば会員サイトなんかは、何をアップロードされるかわからないのが悩ましいところ。
とくにファイル名なんて気にしないでアップされるので、似通ったものが増えまくるのが想像出来る。
また万一日本語ファイル名でも「WP Multibyte Patch」を入れてあれば、日本語でもファイル名をアルファベットに変えてくれるので安心だけど、もうひと工夫して整理しやすい一意なファイル名にしたい。
出来ればアップロード時にオートマで・・・と言うのが今回のお題。
「WP Multibyte Patch」とは
たまにリニューアルなんかで現存のサイトを覗くとこのプラグインを入れてないサイトがある。
ざっくり過ぎるけど「入れてない=日本語対応不完全」と言うことになる。
詳しく話すと面倒だから省くけど、検索機能やフォーム、そして記事に画像などをアップロードする時日本語ファイル名をよしなにしてくれるなど日本語サイトに対して「転ばぬ先の杖」的なプラグインだから。
以前は日本語版をインストールすると入っていたけど、いつの間にかなくなっていたので忘れずに。
sanitize_file_name
散々調べたところどうやら「sanitize_file_name」のフィルターを使えば変更出来ることが判明。
今回の例は会員サイトで購読者がアップロードした際、ユーザーIDを絡めたファイル名に変更するようにしてみた。
/* ex. functions.php */
add_filter( 'sanitize_file_name', 'custom_file_name_change', 10 );
function custom_file_name_change( $filename ) {
$prefix = 'useid';
if ( current_user_can( 'subscriber' ) ) {
$info = pathinfo( $filename );
$ext = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
$user = wp_get_current_user();
$post_author = $user->ID;
$bytes = random_bytes( 6 );
$rand = bin2hex( $bytes );
if ( isset( $post_author ) && !empty( $post_author ) ) {
$finalFileName = $prefix . $post_author . '-' . $rand;
} else {
$finalFileName = $rand;
}
return $finalFileName . $ext;
}
return $filename;
}
これでファイル名が変更される。例えばユーザーIDが「10」で拡張子が「jpg」だとしたら
useid10-012345.jpg
のようなファイル名になる。ハイフンより後の数字は6桁の乱数を入れている。会員数が多数の場合でも1人のアップロード数がそれほど多くないならこの程度でも大丈夫そう。
会員サイトでなくとも、ファイル名を揃えたかったら「current_user_can・・・」の括りを外せばすべてのアップロードに適用されるはず。
もしファイル名の重複が心配なら「random_bytes」の値を増やして調整すればOK。
※上記の場合、購読者でもアップロード出来るように「権限の変更」は必要になるので悪しからず。
まとめ
こういった部分がサラッと出来るのがWPを使っていてうれしいところ。
あまり使用頻度は高いものではないけれど、コアな情報なのでまとめた次第。