首頁 > CMS教程 > &#&按 > WordPress插件以正確的方式更新

WordPress插件以正確的方式更新

Jennifer Aniston
發布: 2025-02-15 12:56:11
原創
926 人瀏覽過

WordPress 插件更新機制詳解及最佳實踐

WordPress 本身並不提供原生插件更新流程,開發者需要自行實現。這包括更新數據庫中的版本號以及必要時創建新的選項。

WordPress 插件的版本號應存儲在兩個地方:插件主文件中的常量和數據庫中的選項。這使得能夠檢測自上次插件更新以來數據庫選項是否已更新。

更新選項時,開發者應注意不要覆蓋用戶的選擇。如果數據庫中不存在某個選項,則應創建它;如果已存在,則不應覆蓋它。

對於存儲為數組的選項,開發者可以使用 PHP 函數 array_merge() 來確保所有鍵都已定義,並且不會引入任何不存在的選項。這也確保如果用戶更改了舊選項,則會保留其值。

幾週前,我收到一封關於 WP Photo Sphere(我開發的一個 WordPress 插件)的郵件。問題很大:更新插件導致某些安裝程序崩潰。經過一番調查,我發現問題源於插件使用的選項:這些安裝程序沒有為我添加的新選項提供任何默認值。

WordPress Plugin Updates the Right Way 這些值非常重要,所以我需要一種方法來創建默認值。但是,與我的想法相反,WordPress 沒有提供任何原生方法來處理更新過程。

這就是我想寫這篇教程的原因。首先,我們將準確了解為什麼我們需要更新過程以及為什麼 WordPress 不提供此類過程。然後,我將向您展示如何正確創建自己的過程來更新您的選項。

插件更新過程的重要性

通常,僅更改文件不足以正確更新某些內容。例如,當您手動將 WordPress 文件更新到新版本時,平台會要求您點擊一個按鈕來更新數據庫。

假設您在插件中使用選項。隨著插件的發展,您在新版本中將需要更多選項。在用戶首次激活插件時創建新選項很容易,您只需使用激活鉤子即可。

例如,讓我們看一下以下代碼:

function my_awesome_plugin_activation() {
    update_option('my_awesome_plugin_option', 'default value');
}
register_activation_hook(__FILE__, 'my_awesome_plugin_activation');
登入後複製
登入後複製
登入後複製
登入後複製

如果您不熟悉使用 update_option() 來代替 add_option(),請不要擔心,我們稍後將在討論如何處理更新過程時進行解釋。

如果您想要一個新的選項,或者如果您在新版本中更新了現有選項的值,則需要更新已經使用您的插件的用戶數據庫,因此我們需要一個在更新後立即調用的函數。

激活鉤子可能有點令人困惑。畢竟,當您自動更新插件時,它會被停用並重新激活,因此我們可以預期會調用此鉤子。但事實並非如此。

更準確地說,它曾經是,但 WordPress 在 3.1 版中停止了此行為。開發團隊解釋了這個選擇,您可以在 Make WordPress Core 博客上閱讀完整的解釋。主要原因是它並非每次都被調用,因為如果用戶手動更新插件,則可以跳過激活鉤子。

因此,WordPress 沒有提供在插件更新後自動調用函數的默認方法。這就是為什麼您需要構建自己的過程。

如何處理更新過程

在本教程的這一部分中,我將向您展示如何在插件更新後自動調用給定函數。我們將在下一部分中看到如何正確處理現有選項的更新以及新選項的創建(在同一個函數中)。

此方法的原理

我們方法的全局原則是,我們將插件的版本號存儲在兩個地方:插件主文件中的常量和數據庫中的選項。

數據庫中的數字將存儲用戶當前安裝的版本,而常量中的數字是當前版本。如果這兩個數字不同,則自上次插件更新以來數據庫選項尚未更新,因此我們需要執行此操作。

在這種情況下,我們將調用一個更新所有必要選項的函數。此函數還更新存儲在數據庫中的版本號:這樣,我們就不會過度調用此函數。

常量

既然我們已經介紹了我們將要做什麼,那麼是時候編寫代碼了!首先,在插件主文件中添加一個常量定義,並將您的當前版本號作為值。為了防止任何問題,我們測試它是否尚未存在。

function my_awesome_plugin_activation() {
    update_option('my_awesome_plugin_option', 'default value');
}
register_activation_hook(__FILE__, 'my_awesome_plugin_activation');
登入後複製
登入後複製
登入後複製
登入後複製

通常,插件版本使用數字標識,但是,如果您使用其他系統,請隨意使用它。這裡的唯一約束是為每個版本或至少為每個需要更改數據庫(新選項、新默認值等)的版本提供唯一的標識符。

檢查函數

我們現在需要編寫一個函數來檢查數據庫是否需要更新。此函數將比較前面定義的常量與當前存儲在數據庫中的值。為此,我們將確保我們的函數在任何地方都被調用,使用 plugins_loaded 動作,一旦所有插件加載完畢就會觸發。

if (!defined('MY_AWESOME_PLUGIN_VERSION'))
    define('MY_AWESOME_PLUGIN_VERSION', '3.4.1');
登入後複製
登入後複製
登入後複製

此函數將很簡單。我們檢索存儲在數據庫中的版本號,就像任何其他選項一樣,並將它與常量進行比較。如果這些值不同,我們將調用 my_awesome_plugin_activation() 函數。

function my_awesome_plugin_check_version() {
}

add_action('plugins_loaded', 'my_awesome_plugin_check_version');
登入後複製
登入後複製
登入後複製

現在,我們需要澄清一些問題。首先,如果選項在數據庫中尚不存在怎麼辦?如果選項不存在,get_option() 將返回 false,這與您的版本號不同,因此將調用該函數。

那麼我們為什麼要調用激活函數呢?明確地說,我們可以創建一個新的函數,專門用於更新過程。但是,如果您這樣做,您會看到這個新函數將與激活非常相似,因為更新選項可以與創建選項的方式相同。

更新數據庫中的版本號

您可以在上面調用的激活函數中做任何您想做的事情。但是,有一件事是必要的,那就是更新存儲在數據庫中的版本號。這樣,我們不會在每次加載頁面時都調用我們的函數。

function my_awesome_plugin_activation() {
    update_option('my_awesome_plugin_option', 'default value');
}
register_activation_hook(__FILE__, 'my_awesome_plugin_activation');
登入後複製
登入後複製
登入後複製
登入後複製

請注意技巧:我們不使用 add_option(),只使用 update_option()。事實上,如果選項尚不存在,update_option() 將創建它。如果它存在,它將把它的值更新為指示的值。這就是為什麼我們可以毫無問題地將我們的激活函數用作更新函數。

更新選項

不要覆蓋用戶的選擇!

更新任何選項都可以與我們更新版本號的方式相同:您可以調用 update_option(),然後就完成了,即使這是 WordPress 第一次看到該選項。

但是,我們並不總是想更新選項值。事實上,如果您使用選項,通常是為了讓您的用戶個性化設置。通過使用 update_option(),您將在每次更新插件時覆蓋用戶的選擇,這不是我們想要做的。

在上面,我們看到如果選項不存在,get_option() 將返回 false。我們將使用此行為來測試我們想要更新的選項是否存在於數據庫中。如果是這種情況,我們什麼也不做。否則,我們創建該選項。

if (!defined('MY_AWESOME_PLUGIN_VERSION'))
    define('MY_AWESOME_PLUGIN_VERSION', '3.4.1');
登入後複製
登入後複製
登入後複製

請注意,此測試對於我們不想覆蓋的選項是必要的。在某些情況下,我們可能想要這樣做,考慮版本號,我們當然不想保留舊值!

特殊情況——數組

您應該知道 WordPress 允許數組存儲我們的選項的值,並且創建它們並不比創建其他選項更難。例如:

function my_awesome_plugin_check_version() {
}

add_action('plugins_loaded', 'my_awesome_plugin_check_version');
登入後複製
登入後複製
登入後複製

如果您需要多個設置,使用數組是一個好主意。這樣,您不會在數據庫中使用大量條目,並且您限制了另一個插件使用相同名稱的選項的機會。但是,當我們考慮更新過程時,這可能會導致問題。

為了理解原因,假設您有一個數組作為選項,帶有一些鍵。您的用戶肯定會個性化這些值。使用我們上面做的測試,我們只能在選項不存在時創建它,並且這些選擇不會被覆蓋。這看起來很簡單,但是如果您想在數組中創建一個新鍵怎麼辦?

如果選項存在於數據庫中,則前面的代碼不會創建它,因此您的新鍵將不存在。但是,如果我們刪除條件,則數組將在每次新更新時檢索其默認值。不太理想。幸運的是,有一個解決方案!

首先,我們定義一個包含選項默認值的數組(如果存在新鍵)。

if (MY_AWESOME_PLUGIN_VERSION !== get_option('my_awesome_plugin_version'))
    my_awesome_plugin_activation();
登入後複製
登入後複製

然後,我們檢索當前存儲在數據庫中的數組。

function my_awesome_plugin_activation() {
    update_option('my_awesome_plugin_option', 'default value');
}
register_activation_hook(__FILE__, 'my_awesome_plugin_activation');
登入後複製
登入後複製
登入後複製
登入後複製

現在我們可以使用 PHP 函數 array_merge(),將我們的默認值數組作為第一個參數,將用戶的數組作為第二個參數。這樣,我們將得到一個包含 $default 數組中定義的所有鍵的數組,並且我們不會有任何不存在的選項。如果用戶更改了舊選項之一,則會保留其值。使用 array_merge(),我們始終保留最新的定義。

if (!defined('MY_AWESOME_PLUGIN_VERSION'))
    define('MY_AWESOME_PLUGIN_VERSION', '3.4.1');
登入後複製
登入後複製
登入後複製

最後,我們使用 update_option() 將結果存儲在數據庫中。

function my_awesome_plugin_check_version() {
}

add_action('plugins_loaded', 'my_awesome_plugin_check_version');
登入後複製
登入後複製
登入後複製

我們快結束了,但是如果函數第一次執行,我們現在需要修復一個您可能會遇到的錯誤。

此函數在插件激活時被調用,這就是我們想要的。但是,在這種情況下,選項尚不存在,因此 get_option() 返回 false。問題是將 false 用作 array_merge() 的參數會導致錯誤。

我們想要的是簡單的,如果選項不存在,我們希望 $option 是一個空數組。為此,我們可以使用 get_option() 的第二個參數,它表示要獲取的默認值(為了不返回 false)。

if (MY_AWESOME_PLUGIN_VERSION !== get_option('my_awesome_plugin_version'))
    my_awesome_plugin_activation();
登入後複製
登入後複製

結論

一旦您仔細閱讀了它,處理 WordPress 插件的更新過程並不復雜。但是,如果您使用選項,這很重要,因為沒有初始化選項可能會導致一些問題。

目前,WordPress 沒有提供處理插件更新的原生方法。事實上,考慮到我們上面列出的問題,如果我們看到有一天引入了這種類型的功能,則應該以類似於本教程的方式實現它。

您可以在這裡獲取我的示例插件的代碼。將此代碼視為實現您自己的 WordPress 插件更新過程的框架。如果您有任何反饋,請在下面的評論中告訴我。

WordPress 插件更新常見問題解答 (FAQ)

定期更新 WordPress 插件的重要性是什麼?

定期更新 WordPress 插件至關重要,原因如下:首先,更新通常包含可以增強網站性能的新功能和功能。其次,更新通常會修復可能危及網站安全的錯誤和漏洞。最後,更新確保與最新版本的 WordPress 兼容,確保您的網站平穩高效地運行。

如何確保安全更新我的 WordPress 插件?

為了確保安全更新,請務必在啟動更新過程之前備份您的網站。這樣,如果在更新過程中出現任何問題,您可以輕鬆地將您的網站恢復到之前的狀態。此外,建議在將其應用於您的實時網站之前,在暫存網站上測試更新。

如果插件更新失敗,我該怎麼辦?

如果插件更新失敗,第一步是從備份中恢復您的網站。然後,嘗試確定失敗的原因。這可能是由於與另一個插件或主題衝突,或者與您的 WordPress 版本存在兼容性問題。一旦您確定了問題,您可以自己解決它,或者聯繫插件開發者尋求幫助。

如何自動執行更新 WordPress 插件的過程?

WordPress 具有內置功能,允許您自動更新插件。您可以通過轉到 WordPress 儀表板中的“插件”部分,選擇您想要自動更新的插件,然後單擊“啟用自動更新”來啟用此功能。

如果插件更新導致我的網站出現問題,我可以回滾插件更新嗎?

是的,如果插件更新導致您的網站出現問題,您可以回滾插件更新。有幾個可用的插件,例如 WP Rollback,允許您輕鬆地恢復到插件的先前版本。

如何更新高級 WordPress 插件?

高級 WordPress 插件的更新方式與免費插件類似。但是,您需要擁有有效的許可證密鑰才能訪問更新。輸入許可證密鑰後,您可以從 WordPress 儀表板更新插件。

管理多個 WordPress 網站的更新的最佳方法是什麼?

如果您正在管理多個 WordPress 網站,則可能需要花費大量時間為每個網站單獨更新插件。更有效的方法是使用 WordPress 管理工具(例如 ManageWP 或 MainWP),它允許您從單個儀表板管理所有網站的更新。

如何禁用特定 WordPress 插件的自動更新?

如果您想禁用特定插件的自動更新,可以使用 Easy Updates Manager 等插件。此插件允許您控製網站上每個插件的自動更新。

如何檢查插件更新與我的 WordPress 版本的兼容性?

在更新插件之前,您可以通過訪問 WordPress 插件目錄上的插件頁面來檢查其與您的 WordPress 版本的兼容性。在這裡,您會找到有關插件與不同 WordPress 版本的兼容性的信息。

如果插件更新破壞了我的網站,我該怎麼辦?

如果插件更新破壞了您的網站,第一步是從備份中恢復您的網站。然後,停用導致問題的插件。如果您無法訪問您的 WordPress 儀表板,您可以通過 FTP 停用插件,方法是重命名 wp-content/plugins 目錄中的插件文件夾。停用插件後,您可以排除故障或聯繫插件開發者尋求幫助。

以上是WordPress插件以正確的方式更新的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板