WordPress 插件更新機(jī)制詳解及最佳實踐
WordPress 本身並不提供原生插件更新流程,開發(fā)者需要自行實現(xiàn)。這包括更新數(shù)據(jù)庫中的版本號以及必要時創(chuàng)建新的選項。
WordPress 插件的版本號應(yīng)存儲在兩個地方:插件主文件中的常量和數(shù)據(jù)庫中的選項。這使得能夠檢測自上次插件更新以來數(shù)據(jù)庫選項是否已更新。
更新選項時,開發(fā)者應(yīng)注意不要覆蓋用戶的選擇。如果數(shù)據(jù)庫中不存在某個選項,則應(yīng)創(chuàng)建它;如果已存在,則不應(yīng)覆蓋它。
對於存儲為數(shù)組的選項,開發(fā)者可以使用 PHP 函數(shù) array_merge()
來確保所有鍵都已定義,並且不會引入任何不存在的選項。這也確保如果用戶更改了舊選項,則會保留其值。
幾週前,我收到一封關(guān)於 WP Photo Sphere(我開發(fā)的一個 WordPress 插件)的郵件。問題很大:更新插件導(dǎo)致某些安裝程序崩潰。經(jīng)過一番調(diào)查,我發(fā)現(xiàn)問題源於插件使用的選項:這些安裝程序沒有為我添加的新選項提供任何默認(rèn)值。
這些值非常重要,所以我需要一種方法來創(chuàng)建默認(rèn)值。但是,與我的想法相反,WordPress 沒有提供任何原生方法來處理更新過程。
這就是我想寫這篇教程的原因。首先,我們將準(zhǔn)確了解為什麼我們需要更新過程以及為什麼 WordPress 不提供此類過程。然後,我將向您展示如何正確創(chuàng)建自己的過程來更新您的選項。
插件更新過程的重要性
通常,僅更改文件不足以正確更新某些內(nèi)容。例如,當(dāng)您手動將 WordPress 文件更新到新版本時,平臺會要求您點擊一個按鈕來更新數(shù)據(jù)庫。
假設(shè)您在插件中使用選項。隨著插件的發(fā)展,您在新版本中將需要更多選項。在用戶首次激活插件時創(chuàng)建新選項很容易,您只需使用激活鉤子即可。
例如,讓我們看一下以下代碼:
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()
,請不要擔(dān)心,我們稍後將在討論如何處理更新過程時進(jìn)行解釋。
如果您想要一個新的選項,或者如果您在新版本中更新了現(xiàn)有選項的值,則需要更新已經(jīng)使用您的插件的用戶數(shù)據(jù)庫,因此我們需要一個在更新後立即調(diào)用的函數(shù)。
激活鉤子可能有點令人困惑。畢竟,當(dāng)您自動更新插件時,它會被停用並重新激活,因此我們可以預(yù)期會調(diào)用此鉤子。但事實並非如此。
更準(zhǔn)確地說,它曾經(jīng)是,但 WordPress 在 3.1 版中停止了此行為。開發(fā)團(tuán)隊解釋了這個選擇,您可以在 Make WordPress Core 博客上閱讀完整的解釋。主要原因是它並非每次都被調(diào)用,因為如果用戶手動更新插件,則可以跳過激活鉤子。
因此,WordPress 沒有提供在插件更新後自動調(diào)用函數(shù)的默認(rèn)方法。這就是為什麼您需要構(gòu)建自己的過程。
如何處理更新過程
在本教程的這一部分中,我將向您展示如何在插件更新後自動調(diào)用給定函數(shù)。我們將在下一部分中看到如何正確處理現(xiàn)有選項的更新以及新選項的創(chuàng)建(在同一個函數(shù)中)。
此方法的原理
我們方法的全局原則是,我們將插件的版本號存儲在兩個地方:插件主文件中的常量和數(shù)據(jù)庫中的選項。
數(shù)據(jù)庫中的數(shù)字將存儲用戶當(dāng)前安裝的版本,而常量中的數(shù)字是當(dāng)前版本。如果這兩個數(shù)字不同,則自上次插件更新以來數(shù)據(jù)庫選項尚未更新,因此我們需要執(zhí)行此操作。
在這種情況下,我們將調(diào)用一個更新所有必要選項的函數(shù)。此函數(shù)還更新存儲在數(shù)據(jù)庫中的版本號:這樣,我們就不會過度調(diào)用此函數(shù)。
常量
既然我們已經(jīng)介紹了我們將要做什麼,那麼是時候編寫代碼了!首先,在插件主文件中添加一個常量定義,並將您的當(dāng)前版本號作為值。為了防止任何問題,我們測試它是否尚未存在。
function my_awesome_plugin_activation() { update_option('my_awesome_plugin_option', 'default value'); } register_activation_hook(__FILE__, 'my_awesome_plugin_activation');
通常,插件版本使用數(shù)字標(biāo)識,但是,如果您使用其他系統(tǒng),請隨意使用它。這裡的唯一約束是為每個版本或至少為每個需要更改數(shù)據(jù)庫(新選項、新默認(rèn)值等)的版本提供唯一的標(biāo)識符。
檢查函數(shù)
我們現(xiàn)在需要編寫一個函數(shù)來檢查數(shù)據(jù)庫是否需要更新。此函數(shù)將比較前面定義的常量與當(dāng)前存儲在數(shù)據(jù)庫中的值。為此,我們將確保我們的函數(shù)在任何地方都被調(diào)用,使用 plugins_loaded
動作,一旦所有插件加載完畢就會觸發(fā)。
if (!defined('MY_AWESOME_PLUGIN_VERSION')) define('MY_AWESOME_PLUGIN_VERSION', '3.4.1');
此函數(shù)將很簡單。我們檢索存儲在數(shù)據(jù)庫中的版本號,就像任何其他選項一樣,並將它與常量進(jìn)行比較。如果這些值不同,我們將調(diào)用 my_awesome_plugin_activation()
函數(shù)。
function my_awesome_plugin_check_version() { } add_action('plugins_loaded', 'my_awesome_plugin_check_version');
現(xiàn)在,我們需要澄清一些問題。首先,如果選項在數(shù)據(jù)庫中尚不存在怎麼辦?如果選項不存在,get_option()
將返回 false,這與您的版本號不同,因此將調(diào)用該函數(shù)。
那麼我們?yōu)槭颤N要調(diào)用激活函數(shù)呢?明確地說,我們可以創(chuàng)建一個新的函數(shù),專門用於更新過程。但是,如果您這樣做,您會看到這個新函數(shù)將與激活非常相似,因為更新選項可以與創(chuàng)建選項的方式相同。
更新數(shù)據(jù)庫中的版本號
您可以在上面調(diào)用的激活函數(shù)中做任何您想做的事情。但是,有一件事是必要的,那就是更新存儲在數(shù)據(jù)庫中的版本號。這樣,我們不會在每次加載頁面時都調(diào)用我們的函數(shù)。
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()
將創(chuàng)建它。如果它存在,它將把它的值更新為指示的值。這就是為什麼我們可以毫無問題地將我們的激活函數(shù)用作更新函數(shù)。
更新選項
不要覆蓋用戶的選擇!
更新任何選項都可以與我們更新版本號的方式相同:您可以調(diào)用 update_option()
,然後就完成了,即使這是 WordPress 第一次看到該選項。
但是,我們並不總是想更新選項值。事實上,如果您使用選項,通常是為了讓您的用戶個性化設(shè)置。通過使用 update_option()
,您將在每次更新插件時覆蓋用戶的選擇,這不是我們想要做的。
在上面,我們看到如果選項不存在,get_option()
將返回 false。我們將使用此行為來測試我們想要更新的選項是否存在於數(shù)據(jù)庫中。如果是這種情況,我們什麼也不做。否則,我們創(chuàng)建該選項。
if (!defined('MY_AWESOME_PLUGIN_VERSION')) define('MY_AWESOME_PLUGIN_VERSION', '3.4.1');
請注意,此測試對於我們不想覆蓋的選項是必要的。在某些情況下,我們可能想要這樣做,考慮版本號,我們當(dāng)然不想保留舊值!
特殊情況——數(shù)組
您應(yīng)該知道 WordPress 允許數(shù)組存儲我們的選項的值,並且創(chuàng)建它們並不比創(chuàng)建其他選項更難。例如:
function my_awesome_plugin_check_version() { } add_action('plugins_loaded', 'my_awesome_plugin_check_version');
如果您需要多個設(shè)置,使用數(shù)組是一個好主意。這樣,您不會在數(shù)據(jù)庫中使用大量條目,並且您限制了另一個插件使用相同名稱的選項的機(jī)會。但是,當(dāng)我們考慮更新過程時,這可能會導(dǎo)致問題。
為了理解原因,假設(shè)您有一個數(shù)組作為選項,帶有一些鍵。您的用戶肯定會個性化這些值。使用我們上面做的測試,我們只能在選項不存在時創(chuàng)建它,並且這些選擇不會被覆蓋。這看起來很簡單,但是如果您想在數(shù)組中創(chuàng)建一個新鍵怎麼辦?
如果選項存在於數(shù)據(jù)庫中,則前面的代碼不會創(chuàng)建它,因此您的新鍵將不存在。但是,如果我們刪除條件,則數(shù)組將在每次新更新時檢索其默認(rèn)值。不太理想。幸運的是,有一個解決方案!
首先,我們定義一個包含選項默認(rèn)值的數(shù)組(如果存在新鍵)。
if (MY_AWESOME_PLUGIN_VERSION !== get_option('my_awesome_plugin_version')) my_awesome_plugin_activation();
然後,我們檢索當(dāng)前存儲在數(shù)據(jù)庫中的數(shù)組。
function my_awesome_plugin_activation() { update_option('my_awesome_plugin_option', 'default value'); } register_activation_hook(__FILE__, 'my_awesome_plugin_activation');
現(xiàn)在我們可以使用 PHP 函數(shù) array_merge()
,將我們的默認(rèn)值數(shù)組作為第一個參數(shù),將用戶的數(shù)組作為第二個參數(shù)。這樣,我們將得到一個包含 $default
數(shù)組中定義的所有鍵的數(shù)組,並且我們不會有任何不存在的選項。如果用戶更改了舊選項之一,則會保留其值。使用 array_merge()
,我們始終保留最新的定義。
if (!defined('MY_AWESOME_PLUGIN_VERSION')) define('MY_AWESOME_PLUGIN_VERSION', '3.4.1');
最後,我們使用 update_option()
將結(jié)果存儲在數(shù)據(jù)庫中。
function my_awesome_plugin_check_version() { } add_action('plugins_loaded', 'my_awesome_plugin_check_version');
我們快結(jié)束了,但是如果函數(shù)第一次執(zhí)行,我們現(xiàn)在需要修復(fù)一個您可能會遇到的錯誤。
此函數(shù)在插件激活時被調(diào)用,這就是我們想要的。但是,在這種情況下,選項尚不存在,因此 get_option()
返回 false。問題是將 false 用作 array_merge()
的參數(shù)會導(dǎo)致錯誤。
我們想要的是簡單的,如果選項不存在,我們希望 $option
是一個空數(shù)組。為此,我們可以使用 get_option()
的第二個參數(shù),它表示要獲取的默認(rèn)值(為了不返回 false)。
if (MY_AWESOME_PLUGIN_VERSION !== get_option('my_awesome_plugin_version')) my_awesome_plugin_activation();
結(jié)論
一旦您仔細(xì)閱讀了它,處理 WordPress 插件的更新過程並不復(fù)雜。但是,如果您使用選項,這很重要,因為沒有初始化選項可能會導(dǎo)致一些問題。
目前,WordPress 沒有提供處理插件更新的原生方法。事實上,考慮到我們上面列出的問題,如果我們看到有一天引入了這種類型的功能,則應(yīng)該以類似於本教程的方式實現(xiàn)它。
您可以在這裡獲取我的示例插件的代碼。將此代碼視為實現(xiàn)您自己的 WordPress 插件更新過程的框架。如果您有任何反饋,請在下面的評論中告訴我。
WordPress 插件更新常見問題解答 (FAQ)
定期更新 WordPress 插件的重要性是什麼?
定期更新 WordPress 插件至關(guān)重要,原因如下:首先,更新通常包含可以增強(qiáng)網(wǎng)站性能的新功能和功能。其次,更新通常會修復(fù)可能危及網(wǎng)站安全的錯誤和漏洞。最後,更新確保與最新版本的 WordPress 兼容,確保您的網(wǎng)站平穩(wěn)高效地運行。
如何確保安全更新我的 WordPress 插件?
為了確保安全更新,請務(wù)必在啟動更新過程之前備份您的網(wǎng)站。這樣,如果在更新過程中出現(xiàn)任何問題,您可以輕鬆地將您的網(wǎng)站恢復(fù)到之前的狀態(tài)。此外,建議在將其應(yīng)用於您的實時網(wǎng)站之前,在暫存網(wǎng)站上測試更新。
如果插件更新失敗,我該怎麼辦?
如果插件更新失敗,第一步是從備份中恢復(fù)您的網(wǎng)站。然後,嘗試確定失敗的原因。這可能是由於與另一個插件或主題衝突,或者與您的 WordPress 版本存在兼容性問題。一旦您確定了問題,您可以自己解決它,或者聯(lián)繫插件開發(fā)者尋求幫助。
如何自動執(zhí)行更新 WordPress 插件的過程?
WordPress 具有內(nèi)置功能,允許您自動更新插件。您可以通過轉(zhuǎn)到 WordPress 儀表板中的“插件”部分,選擇您想要自動更新的插件,然後單擊“啟用自動更新”來啟用此功能。
如果插件更新導(dǎo)致我的網(wǎng)站出現(xiàn)問題,我可以回滾插件更新嗎?
是的,如果插件更新導(dǎo)致您的網(wǎng)站出現(xiàn)問題,您可以回滾插件更新。有幾個可用的插件,例如 WP Rollback,允許您輕鬆地恢復(fù)到插件的先前版本。
如何更新高級 WordPress 插件?
高級 WordPress 插件的更新方式與免費插件類似。但是,您需要擁有有效的許可證密鑰才能訪問更新。輸入許可證密鑰後,您可以從 WordPress 儀表板更新插件。
管理多個 WordPress 網(wǎng)站的更新的最佳方法是什麼?
如果您正在管理多個 WordPress 網(wǎng)站,則可能需要花費大量時間為每個網(wǎng)站單獨更新插件。更有效的方法是使用 WordPress 管理工具(例如 ManageWP 或 MainWP),它允許您從單個儀表板管理所有網(wǎng)站的更新。
如何禁用特定 WordPress 插件的自動更新?
如果您想禁用特定插件的自動更新,可以使用 Easy Updates Manager 等插件。此插件允許您控製網(wǎng)站上每個插件的自動更新。
如何檢查插件更新與我的 WordPress 版本的兼容性?
在更新插件之前,您可以通過訪問 WordPress 插件目錄上的插件頁面來檢查其與您的 WordPress 版本的兼容性。在這裡,您會找到有關(guān)插件與不同 WordPress 版本的兼容性的信息。
如果插件更新破壞了我的網(wǎng)站,我該怎麼辦?
如果插件更新破壞了您的網(wǎng)站,第一步是從備份中恢復(fù)您的網(wǎng)站。然後,停用導(dǎo)致問題的插件。如果您無法訪問您的 WordPress 儀表板,您可以通過 FTP 停用插件,方法是重命名 wp-content/plugins 目錄中的插件文件夾。停用插件後,您可以排除故障或聯(lián)繫插件開發(fā)者尋求幫助。
以上是WordPress插件以正確的方式更新的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

使用Git管理WordPress項目時,應(yīng)只將主題、自定義插件和配置文件納入版本控制;設(shè)置.gitignore文件以忽略上傳目錄、緩存和敏感配置;利用webhook或CI工具實現(xiàn)自動部署並註意數(shù)據(jù)庫處理;採用兩分支策略(main/develop)進(jìn)行協(xié)作開發(fā)。這樣做可避免衝突、保障安全,並提升協(xié)作與部署效率。

創(chuàng)建Gutenberg塊的關(guān)鍵在於理解其基本結(jié)構(gòu)並正確連接前後端資源。 1.準(zhǔn)備開發(fā)環(huán)境:安裝本地WordPress、Node.js和@wordpress/scripts;2.使用PHP註冊塊並用JavaScript定義塊的編輯和顯示邏輯;3.通過npm構(gòu)建JS文件以使更改生效;4.遇到問題時檢查路徑、圖標(biāo)是否正確或使用實時監(jiān)聽構(gòu)建避免重複手動編譯。按照這些步驟,可以逐步實現(xiàn)一個簡單的Gutenberg塊。

使用WordPress測試環(huán)境是為了確保新功能、插件或主題在正式上線前的安全性和兼容性,避免影響真實網(wǎng)站。搭建測試環(huán)境的步驟包括:下載安裝本地服務(wù)器軟件(如LocalWP、XAMPP),創(chuàng)建站點、設(shè)置數(shù)據(jù)庫和管理員賬號,安裝主題和插件進(jìn)行測試;複製正式網(wǎng)站到測試環(huán)境的方法是通過插件導(dǎo)出站點、導(dǎo)入測試環(huán)境並替換域名;使用時應(yīng)注意不使用真實用戶數(shù)據(jù)、定期清理無用數(shù)據(jù)、備份測試狀態(tài)、適時重置環(huán)境,並統(tǒng)一團(tuán)隊配置以減少差異問題。

在WordPress中,當(dāng)新增自定義文章類型或修改固定鏈接結(jié)構(gòu)後,需手動刷新重寫規(guī)則,此時可通過代碼調(diào)用flush_rewrite_rules()函數(shù)實現(xiàn)。 1.可在主題或插件激活鉤子中添加該函數(shù)以自動刷新;2.僅在必要時執(zhí)行一次,如添加CPT、分類法或修改鏈接結(jié)構(gòu)後;3.避免頻繁調(diào)用以免影響性能;4.多站點環(huán)境下需視情況為每個站點單獨刷新;5.某些託管環(huán)境可能限制規(guī)則保存。此外,訪問“設(shè)置>固定鏈接”頁麵點擊保存也可觸髮刷新,適合非自動化場景。

tosetupredirectsinwordpressingthe.htaccessfile,locateThEfileInyourSite'sRootDirectorectoryAndDrectRectrulesabovethe#beginWordPresssection.forbasic301redirects,USETHEETHEETERECTREFTATRECTATREDERTREFTATREDERTREFTATRECTRECTATRECTRECTATREDECT301/OLD-PAGEHTTPS:

UsingsMtpForWordPresseMailSimProvesDeliverabilitialComparedComparedTothEdeDefaultPhpMail()函數(shù).1.smtpauthenticateswithyouremailserver.2.somemomehostsdisablesablephpmail()

要實現(xiàn)響應(yīng)式WordPress主題設(shè)計,首先要使用HTML5和移動優(yōu)先的Meta標(biāo)籤,在header.php中添加viewport設(shè)置以確保移動端正確顯示,並用HTML5結(jié)構(gòu)標(biāo)籤組織佈局;其次,利用CSS媒體查詢實現(xiàn)不同屏幕寬度下的樣式適配,按移動優(yōu)先原則編寫樣式,常用斷點包括480px、768px和1024px;第三,彈性處理圖片和佈局,為圖片設(shè)置max-width:100%並使用Flexbox或Grid佈局替代固定寬度;最後,通過瀏覽器開發(fā)者工具和真實設(shè)備進(jìn)行充分測試,優(yōu)化加載性能,確保響應(yīng)

TOINTEGRATETHIRD-PARTYAPISINTOWORDPRESS,關(guān)注臺詞:1.SelectAutableabepianDobtainCredentialslikeapikeYsoroAuthtoKensByEnterRegisteringThemSecure.2.ChooseBeteBetB????eteBetB????eteBetB????etebetInpliCityOorcustimplicityOrcustomPliCoseTompliCoseTomploomcoseusionfunctionfunctionfunctibunitiacuciencipuity forfunigation。
