バラカダムの答えはほぼ正しいです。彼の答えの下に残したコメントに基づいて少し修正しただけです。
function new_filename($filename, $filename_raw) {
global $post;
$info = pathinfo($filename);
$ext = empty($info['extension']) ? '' : '.' . $info['extension'];
$new = $post->post_title . $ext;
// the if is to make sure the script goes into an indefinate loop
if( $new != $filename_raw ) {
$new = sanitize_file_name( $new );
}
return $new;
}
add_filter('sanitize_file_name', 'new_filename', 10, 2);
コードの説明:
picture one.jpg
「My Holiday in Paris/London」という名前の投稿に、元のファイル名が付けられたファイルをアップロードするとします。
ファイルをアップロードすると、WordPress は関数を使用して元のファイル名から特殊文字を削除しsanitize_file_name()
ます。
関数の一番下にフィルターがあります。
// line 854 of wp-includes/formatting.php
return apply_filters('sanitize_file_name', $filename, $filename_raw);
この時点で、$filename はpicture-one.jpg
. を使用したためadd_filter()
、 new_filename() 関数は $filename としてpicture-one.jpg
、 $filename_rawとして呼び出されますpicture one.jpg
。
new_filename() 関数は、ファイル名を投稿タイトルに元の拡張子を追加したものに置き換えます。ここでやめると、新しいファイル名は、誰もが知っている無効なファイル名になって$new
しまいます。My Holiday in Paris/London.jpg
ここで、sanitize_file_name 関数を再度呼び出します。そこの条件文に注意してください。この$new != $filename_raw
時点で、ファイル名を再度サニタイズしようとします。
sanitize_file_name()
が呼び出され、関数の最後に、 に$filename
なりますがMy-Holiday-in-Paris-London.jpg
、$filename_raw
それでもMy Holiday in Paris/London.jpg
. のため、apply_filters()
関数new_filename()
が再び実行されます。でも今回は$new == $filename_raw
、だから、それで終わりです。
そしてMy-Holiday-in-Paris-London.jpg
ついに返却。