WordPress 上傳圖片時自動重新命名與資料夾分類

惱人的命名方式與快取機制

WordPress 上傳圖片時預設會連同檔名一起保存,當文章寫好後一張張圖片重新命名操作起來十分麻煩,數張圖片必須一張張點開命名+修改永久連結,媒體庫的操作真的極度反人性化。

還有一點就是如果網站有使用 Jetpack CDN 圖片快取的話,圖片一旦被快取後是沒辦法刪除、更新,只要上傳檔名相同的圖片 Jetpack CDN 永遠只會顯示最初的版本。

Jetpack 官方也明確提到圖片快取是永久的,更新唯一的方法就只有更換圖片檔名

每次重新命名圖片還要避免跟曾經用過的檔名重複,對習慣邊寫邊改的人來說這設計真的很讓人頭痛,先改名再上傳、先上傳再改名,怎麼操作都不順。

透過 wp_handle_upload_prefilter 自訂媒體名稱

WordPress 有提供可以插入自訂程式碼的錨點(Hook),其中有個錨點 wp_handle_upload_prefilter 就是在媒體上傳後、檔案歸檔之前觸發的,可以把希望重新命名的檔名在這階段做定義。

插入程式碼的方式筆者推薦使用 Code Snippets 外掛,免費版就能插入 PHP、HTML 程式碼,而且有提供備註欄位、開關等功能,介面也是繁體中文的。教學如下:

  1. 點擊側邊欄的 程式碼片段 > 新增程式碼片段,標題的部分自行命名方便辨識即可,程式碼種類選擇 PHP,並將執行範圍設定為 全域執行。
  1. 將以下代碼貼上並儲存,檔名的部分可依個人需求調整。
    我自己是不希望檔名太長,同時希望檔名看的出上傳日期 (方便定期將圖片拉去手動壓縮)
    會建議將 UNIX 時間一同納入 MD5 湊雜計算,這樣即使相同檔名的圖檔,也會因為上傳的時間不同而產生不同檔名。
PHP
function mur_name_changer($file){
	$info = pathinfo($file['name']);                  //取得上傳檔案名稱
	$ext  = '.' . $info['extension'];                 //取得上傳檔案副檔名
	$hash = md5(strval(time()).$file['name']);        //用 "UNIX 時間 + 媒體名稱" 取 MD5	
	$hash = substr(base_convert($hash,16,36),-6);     //將 MD5 從 16 進位轉換成 36 進位,取末 6 碼作為新的 Hash
	$day  = date("d");                                //取得今天日期
  $file['name'] = $day."-".$hash.$ext;              //最後檔名格式會像:05-esfwrh.jpg
    return $file;
}

//將程式碼追加至錨點
add_filter('wp_handle_upload_prefilter', 'mur_name_changer' );


透過這段程式碼上傳後的圖片檔名簡短、長度固定且幾乎不可能重複(36^6,20億分之1的機率),目前使用下來算是非常滿意。

透過 upload_dir 自訂上傳資料夾路徑

除了圖片檔名外,上傳的資料夾路徑也是可以做調整的,Wordpress 預設只提供按照年月做資料夾分類,或是乾脆不分類大雜燴全部塞 wp-uploads 資料夾中。

像我就覺得預設的年月分類太冗長,2023一個資料夾、2024又一個資料夾,每個資料夾又再分 1 ~ 12月。想把他精簡成2404、2405這樣就好。Wordpress 也有提供 upload_dir 錨點可以插入程式碼。

PHP
function mur_folder_changer($uploads){
	$dir = "/".date("ym");      //自定義資料夾名稱:yymm ex:2403
	$uploads['path'] .= $dir;   //追加至路徑
	$uploads['url']  .= $dir;   //追加至永久連結
	return $uploads;
}

//將程式碼追加至錨點
add_filter('upload_dir','mur_folder_changer');

date 函式可以依照個人需求做調整,比方說希望每年存一個資料夾就好,那就把 date("ym") 改成 date("y")(24)date("Y") (2024),詳細輸出的日期格式可以參考這篇教學

    本文結束,放個廣告加減賺
    廣告結束

    發表迴響

    返回頂端