2012-12-06 59 views
3

我正在嘗試重命名上傳文件名與帖子標題相匹配。在Wordpress中上傳過程中重命名文件

這個其他線程展示瞭如何重命名爲亂碼:
Rename files during upload within Wordpress backend

使用此代碼:

function make_filename_hash($filename) { 
    $info = pathinfo($filename); 
    $ext = empty($info['extension']) ? '' : '.' . $info['extension']; 
    $name = basename($filename, $ext); 
    return md5($name) . $ext; 
} 
add_filter('sanitize_file_name', 'make_filename_hash', 10); 

有誰知道代碼文件重命名爲賽後的Title.extension?

回答

4

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()將被調用,在函數結束時,$filenameMy-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終於返回。

+0

+1寫得很好!如果同一個文件上傳兩次會發生什麼? – brasofilo

+0

這太棒了!似乎按預期工作。 – jonbennett

+0

@brasofilo你可以看看這種情況嗎? [link](http://stackoverflow.com/questions/13809555/rename-files-during-upload-within-wordpress-and-gravity-form) – jonbennett

0

是這樣的嗎? (考慮$post是你的變量後,使其全球):

function new_filename($filename) { 
    global $post; 
    $info = pathinfo($filename); 
    $ext = empty($info['extension']) ? '' : '.' . $info['extension']; 
    return $post->post_title . $ext; 
} 
add_filter('sanitize_file_name', 'new_filename', 10); 

我才明白你嗎?

+1

您希望對帖子標題做些什麼,因爲它可能對命名文件不安全。用斜線標題標題肯定會破壞代碼。是的,WordPress會清理上傳文件的文件名,但添加過濾器會覆蓋它,您需要再次調用它。 http://core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/formatting.php#L814 – mushroom