如何在 WordPress 中從媒體庫中刪除未使用的圖像

已發表: 2019-10-15

當您的網站運行了一段時間後,有些東西不再需要但仍然存在是正常的。 最煩人的例子之一是不再使用但繼續佔用 WordPress 空間的圖像。

這些您不再在您的帖子或頁面中使用的圖像,或者在任何其他類型的已過時的內容中,仍然託管在您的服務器上,從而浪費資源和存儲空間。 如果您不打算再次使用它們,您可以對它們做的最好的事情就是消除它們。 但是你怎麼能找到它們並確保它們沒有在任何地方被使用呢? 讓我們來看看它…

在開始之前

如果要從 WordPress 中刪除不再使用的圖像,首先要做的是製作網站的備份副本,包括wp-content文件夾中的媒體文件。

儘管您上傳到媒體庫的圖像存儲在wp-content/uploads/中,但如果您使用插件上傳文件,它們最終可能會位於不同的文件夾中。 因此,請確保您擁有 WordPress 數據庫的備份副本以及wp-content文件夾中的所有文件,而不僅僅是wp-content/uploads

創建備份後,我們可以繼續執行以下步驟……

檢測 WordPress 中的孤立圖像

有幾種方法可以檢測 WordPress 網站內任何內容中不再使用的圖像。 最有效的是在 WordPress 數據庫中搜索它們。

為此,我們必須知道您上傳到 WordPress 媒體庫的圖像存儲在表wp_posts中,就好像它們是帖子或頁面一樣。 它們與存儲在此表中的其他內容的區別在於它們在post_type列中具有附件值。

順便說一句,重要的注意事項:如果您不了解數據庫,最好從現在開始小心您所做的事情,保留數據庫的備份,並查看這篇 WordPress Codex 文章,他們在其中解釋了所有內容更多詳情。

我們剛剛說到哪了? 哦,是的:我們希望找到所有未在您的 WordPress 中使用的圖像。 這比定義容易,但別擔心,我們將嘗試以簡單的方式一步一步地解釋它。

我們所要做的就是用 SQL 語言編寫一個查詢以在 WordPress MySQL 數據庫中運行。 如果您不知道如何訪問您的網站數據庫,請聯繫您的託管服務提供商以獲取有關如何訪問的說明。 如果他們允許您訪問 phpMyAdmin,也可以

您需要運行的查詢是:

讓我們分解一下。

我們要做的第一件事是從SELECT語句開始選擇特定表的所有特定行。 在第 2 行中,星號表示我們想要每一行中的“所有列”。

第 3 行和第 4 行表示我們感興趣的表。在這種情況下,我們要選擇 WordPress 附件,正如我所說,它們存儲在wp_posts中,這就是我們將使用的表。

從第 5 行開始, WHERE語句讓我們添加條件來過濾我們想要的行並排除其餘行。 第 6 行和第 14 行之間的每個條件都由AND指令分隔,該指令用於指示必須同時滿足所有條件。 如果一行不滿足所有WHERE條件,則不會在SELECT查詢的輸出中返回。

第 6 行的第一個條件定義我們只想獲取post_type列中值為attachment的行。 正如我之前所說,帖子和頁面以及其他內容也存儲在wp_posts表中。 在這種情況下,我們只會得到圖像。

對於每個附件,WordPress 會使用post_parent列存儲它是在頁面上下文中上傳還是在帖子中上傳。 因此,第 8 行的條件使我們只能獲取那些post_parent不存在的附件(即它們沒有綁定到任何頁面或帖子)。

另一方面,如果我們選擇一張圖片作為文章或頁面的特色圖片,WordPress 會在wp_postmeta表中創建一個元數據行,其鍵為_thumbnail_id ,並作為值設置附件圖片的標識符。 在查詢的第 10 行中,我們得到了那些其標識符沒有作為鍵_thumbnail_idwp_postmeta行的值出現的圖像。

第 12 行定義了過濾其 URL 未出現在帖子或頁面內容中的圖像的條件。 也就是說,如果圖像的 URL 出現在內容中,我們假設圖像仍然有用,因此不應刪除。 請注意,圖像的 URL 出現在wp_posts表的guid列中。

最後,您可能使用了一些插件,將圖像的 URL 放入wp_postmeta表的行中。 第 14 行的條件使我們能夠檢測到這種特殊情況。

就是這樣! 運行此 SQL 查詢將返回據稱未在您網站的任何地方使用的所有圖像。

請記住,在查找孤兒圖像時,可能會出現誤報。 也就是說,標記為未使用但實際上在 WordPress 中使用的圖像。 這是因為您可以使用定義自己的表並在其中保留對圖像的引用的插件。 如果這是您的情況,您必須通過添加其他條件來調整查詢以涵蓋這些情況。

刪除 WordPress 中的孤立圖像

現在我們有了可能不會在 WordPress 中使用的圖像,我們應該看看結果,看看我們列出的所有圖像是否都在使用。 根據我們找到的內容,我們可以通過添加更多條件來優化查詢,如前所述。 如果一切看起來都正確,您可以繼續前進。

要刪除 WordPress 中的附件,我們有功能wp_delete_attachment ,您可以在此處找到描述。 如果您查看文檔,您將看到此函數獲取附件標識符和一個布爾參數,指示您是要強制刪除還是只是將其丟棄。

當您在 WordPress 中調用此函數時,它將刪除附件及其所有相關信息,包括可能的評論、分類中的外觀、相關元數據,最重要的是,存儲在wp-content文件夾中的圖像文件。

要獲得我們將在 PHP 中使用的wp_delete_attachment指令列表,我們只需更改前一個查詢的第 2 行,以便SELECT查詢返回的是構造我們想要的指令的字符串。 查詢返回的每一行一個。 你可以在這裡看到結果:

用於檢測未使用圖像並獲取在 WordPress 中刪除它們的 PHP 代碼的 SQL 指令。
用於檢測未使用圖像並獲取在 WordPress 中刪除它們的 PHP 代碼的 SQL 指令。

現在您只需複制所有這些說明並粘貼它們,例如,在您的主題的文件functions.php中並訪問您的網站。 這將導致執行這些指令,從您的 WordPress 中刪除孤立的圖像。 之後,刪除之前粘貼的說明,因為它們將不再需要。

請記住檢查您的網站是否仍然正常運行,並且您沒有刪除相關圖像。 如果出現問題,請不要擔心:您應該備份您的數據庫和wp-content文件夾,這樣您就應該能夠將您的網站恢復到之前的狀態。

如果您在使用 SQL 和數據庫時遇到問題,或者您不理解我在這裡解釋的任何內容,請先在下面寫下評論讓我知道。 之後,嘗試使用 Media Cleaner 之類的插件。 您將獲得的最終結果必須與我們在這篇文章中看到的非常相似。

Gary ChanUnsplash的特色圖片