barakadam的回答幾乎是正確的,只是基於我在答案下面留下的評論進行了一點修正。
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
到一個名爲「我的假期在巴黎/倫敦」後原來的文件名。
當您上傳文件時,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
終於返回。
+1寫得很好!如果同一個文件上傳兩次會發生什麼? – brasofilo
這太棒了!似乎按預期工作。 – jonbennett
@brasofilo你可以看看這種情況嗎? [link](http://stackoverflow.com/questions/13809555/rename-files-during-upload-within-wordpress-and-gravity-form) – jonbennett