WorldWideWeb

重新將WordPress媒體照片依年月份檔案夾歸檔

一個朋友的WordPress當初沒有在設定>媒體>上傳檔案裡面,勾選「為上傳的檔案建立以年份月份命名的資料夾」,導致後來wp-content/uploads裡面有著上萬張圖片。在chatgpt的協助下,完成了重新將照片依照年月份去歸檔的工作。

1・先進行WordPress裡的設定

在後台,先勾選「為上傳的檔案建立以年份月份命名的資料夾」這個設定,之前的圖片依舊,但之後加入的圖片就會放入當月份的檔案夾內。

2・SSH進入後台整理圖片

遠端ssh登入後,cd /path/to/wp-content/uploads

find . -maxdepth 1 -type f -exec sh -c '
    for file; do
        year=$(date -r "$file" +"%Y")
        month=$(date -r "$file" +"%m")
        mkdir -p "$year/$month"
        mv "$file" "$year/$month/"
    done
' sh {} +

如果過程中產生權限問題,可使用sudo。這個指令會開始跑一段時間,依照圖片的最後修改日期,將圖片搬入建立好的年份及月份檔案夾中。

指令完成工作後,因為圖片已經搬到不同位置去,所以前台會看到破圖。

3・修改資料庫內的連結位置

首先先登入資料庫 mysql -u root -p

選擇資料庫名稱:USE database_name;

UPDATE wp_posts 
SET post_content = REPLACE(post_content, 'wp-content/uploads/', 'wp-content/uploads/2025/01/')
WHERE post_content LIKE '%wp-content/uploads/%';

UPDATE wp_postmeta 
SET meta_value = REPLACE(meta_value, 'wp-content/uploads/', 'wp-content/uploads/2025/01/')
WHERE meta_value LIKE '%wp-content/uploads/%';

這個mysql指令會進入修改圖片的連結,將原本放置的位置「wp-content/uploads/」,改成新的位置「wp-content/uploads/2025/01/」。而當中年份和月份的數字,要在uploads裡面看有哪些年月份有出現,不是每個月都會上傳圖片,另如2024有出現1、3、6、10這些月份,都要分別改變上述語法的年份和月份的數字,個別跑一次修改。

因為我將語法先在便條紙內修改,然後貼進去ssh,所以也滿快的,四年的圖片用的指令花不到三分鐘。

改完mysql後,前台看到的圖片「大部分」都會正常。

少部分還是破圖的圖片,我問過chatgpt,得不到近一步解決的方式。其中他有提到有些 wp_posts post_content 裡面的路徑,可能開頭會有斜線/,也可能沒有斜線/。有斜線的像是這樣: (每個wp-content之前都多了斜線/,共6處)

UPDATE wp_posts 
SET post_content = REPLACE(post_content, '/wp-content/uploads/', '/wp-content/uploads/2025/01/')
WHERE post_content LIKE '%/wp-content/uploads/%';

UPDATE wp_postmeta 
SET meta_value = REPLACE(meta_value, '/wp-content/uploads/', '/wp-content/uploads/2025/01/')
WHERE meta_value LIKE '%/wp-content/uploads/%';

另外也得到下面資料表的修改,但好像沒有解決問題:

UPDATE wp_posts 
SET guid = REPLACE(guid, 'wp-content/uploads/', 'wp-content/uploads/2021/10/')
WHERE guid LIKE '%wp-content/uploads/%';

以上是ai教的方式,以下是我自己再補足的方法。

4・手動修改圖片正確位置

由於有一些圖片還是破圖,沒辦法再修改資料庫那個步驟獲得修正,所以我後來自己加上了手動改圖的方式。

4-1・先安裝Enable Media Replace這個外掛

4-2・後台媒體庫以月份和列表方式呈現

這是方便加快人工作業的模式,若是你的電腦環境不見得適合此方式,跳過這步驟也可以。

4-3・找到缺圖的圖片,點選「更換媒體檔案」和「下載檔案」

如果是缺圖的圖片,左側縮圖會是「完全空白」(或是有破圖的小圖片)的,所以很好找。

滑鼠移到那張圖片的欄位,會出現底下一排動作(編輯 | 永久刪除 | 檢視⋯⋯),我會按著command鍵,先點一下「更換媒體檔案」這個連結,再點一下「下載檔案」這個連結,這時這兩個圖片的連結會以新分頁分別開啟兩個分頁。

下載檔案」的這個分頁,會顯示404找不到檔案,在網址裡面 https://www.abc.com/wp-content/uploads/IMG_7391.jpg是原先的位置,但是圖片已經依照年份月份移到新的位置,我會在uploads/後面加入「2025/01/」這樣,讓網址變成新的位置再reload一遍(https://www.abc.com/wp-content/uploads/2025/01/IMG_7391.jpg),等圖片正常顯示,將這張圖片拉到桌面上存放。然後關閉這個圖片分頁。

接下來看「更換媒體檔案」這個分頁,這個功能是外掛Enable Media Replace所提供,它的分頁像下圖這樣。將剛剛拉到桌面上存放的圖片再拖進這個分頁,用桌面上原本的圖片將伺服器上的圖片進行替換,最主要的用意是用這個方式「更新資料庫裡路徑的資訊」。

  1. 更換方式選項選擇「僅更換檔案」
  2. 選項選擇「使用舊版檔案日期」
  3. 然後按上傳
  4. 上傳完畢就可以關閉此分頁

到此完成這步驟缺圖的圖片就會正常顯示。再尋找同月份其他缺圖的圖片,依序4-3這個程序裡面,點開「更換媒體檔案」和「下載檔案」這兩個分頁,再重複相同人工修正的步驟。

前面依照月份呈現媒體檔案的模式,比較不容易搞混這項工作。我用MacOS的瀏覽器環境,左手使用快速鍵 Command ⌘+ p 貼上網址的年月份修正正確路徑,然後 Command ⌘+ w 關閉分頁;右手則將鼠標移到要點選開分頁和貼上的網址位置,以及進行圖片的拖拉放,一百張左右破圖用人工修正大概花費一個小時左右作業時間。

檢視前台,所有圖片都正常了。