為什麼一些 WordPress 插件會在數據庫中留下孤立的表
已發表: 2016-06-23目錄上的 WordPress 插件評論有各種形式和大小。 有些真的很有幫助,而另一些則簡短而中肯。 例如,最近一位 WP eCommerce 用戶的評論說:“我卸載了它,它留下了孤兒表,我現在必須手動清理。 做得不好。”
這種類型的評論很容易被忽視,但 WP eCommerce 的聯合創始人賈斯汀·桑頓(Justin Sainton)以最好的方式做出了回應。 他承認用戶的投訴,並承認他們提出了一個重要的觀點,團隊可以以更好的方式記錄下來。
“當人們卸載或停用 WP eCommerce 時,我們做出了一個非常有意的決定,即不從數據庫中刪除表格,”Saton 說。
“我們多年來遇到的任何原因都會導致有人停用和卸載他們的插件。 即使 WordPress 清楚地表明(如果您有卸載程序)您正在刪除數據 - 這是一個很容易在您執行任務時忽略的通知。
“出於這些原因,我們有意決定在卸載時不刪除任何數據(如果無意刪除,其中大部分將對企業造成極大的損害)。”
什麼是孤立表?
孤立表是那些在卸載時不執行表清理的插件留下的表。 這些表通常包含數據,包括表單、條目、設置等。例如,當我在 Tavern 的測試站點上安裝 GravityForms 2.0 時,我發現我六年前創建的表單仍在數據庫中。 我不僅感到驚訝,而且很慶幸多年前我沒有告訴 GravityForms 刪除數據。
停用插件不應刪除數據
停用插件和卸載插件之間有明顯的區別。 由於故障排除過程,停用插件的過程比卸載更頻繁。 停用插件不應從數據庫中刪除任何數據。 想想停用插件然後必須重新配置其設置會有多令人沮喪?
刪除數據應該是明確的
相反,刪除數據應該是用戶的明確操作。 想要讓用戶能夠在卸載時刪除數據的插件開發人員可以註冊一個卸載掛鉤並添加一個 Uninstall.php 文件。 來自有關 Uninstall.php 的 WordPress 開發人員參考指南。
如果沒有在插件中運行代碼就無法編寫插件,那麼插件應該在基本插件文件夾中創建一個名為“uninstall.php”的文件。 如果存在此文件,將在繞過卸載掛鉤的卸載過程中調用該文件。 該插件在使用“uninstall.php”時應始終在執行前檢查“WP_UNINSTALL_PLUGIN”常量。
使用此方法的開發者應向用戶提供清晰簡潔的確認提示,警告數據將被刪除。 GravityForms 就是一個很好的插件示例。 卸載例程與停用過程是分開的,警告清楚地向用戶說明數據將丟失。

在 2013 年發佈到 Tavern 的評論中,RocketGenius 的創始人 Carl Hancock 解釋了為什麼他們使用自己的卸載過程而不是建議使用 Uninstall.php。

例如,我們通常通過插件管理器在我們自己的測試機器上停用和刪除 GF 和附加組件的版本,然後上傳和安裝不同的版本。 這並不意味著我們想要丟失所有數據。 因此,當我們在插件管理器中刪除插件時,我們當然不希望發生這種情況。
這就是為什麼我們選擇在重力表單設置區域中實現我們自己的完全卸載版本,這讓最終用戶非常清楚它將刪除所有數據並刪除所有數據庫表。
孤立表通常不會影響站點性能
有些人認為過多的孤立表會對站點的性能產生負面影響。 我問桑頓這是不是真的,“一般來說,沒有,”桑頓回答。
“在某些情況下,數據庫中存在的表數量可能會影響某些查詢的性能——但這些類型的查詢永遠不應該在大多數情況下真正運行——當然不會在 WordPress 開發人員感興趣的大多數情況下運行。 。”
孤立的表和其中的數據包含在 WordPress 數據庫中,大多數普通用戶很少深入研究。 大多數人可能不知道數據庫中的數據量和表佔用了字節空間。 很高興知道在大多數情況下,孤立表不會降低站點的性能,也不必太擔心。
清理孤立的表
有許多插件可以優化和清理數據庫中的孤立表。 粗略搜索插件目錄提供以下結果。
- WP-優化
- P3(插件性能分析器)
- WP-DBManager
- WP 性能包
插件比我在這裡列出的要多,但每個插件都交互和操作 WordPress 數據庫。 我從經驗中了解到,在使用任何數據庫清理和優化插件之前,您應該為您的站點創建一個完整備份。
我曾經使用過一個數據庫清理插件,雖然它完成了這項工作,但它刪除了我沒想到的東西,比如由 Edit Flow 生成的自定義帖子狀態。
卸載過程應該成為插件目錄指南嗎?
與插件管理頁面的設置鏈接一樣,該目錄中的一些插件不使用 Uninstall.php 或註冊卸載鉤子。 我堅信任何將數據添加到數據庫的插件都應該提供一種簡單的刪除方法。 這是一個指導方針,如果強制執行將通過幫助維護更清潔的數據庫來使用戶受益。
開發人員,請在評論中告訴我們您做了什麼來使用戶能夠在您的插件添加數據後從數據庫中刪除數據。
