自遠古以來,只在官方WordPress.org插件目錄托管的插件都支持自動更新。現(xiàn)在,我已經(jīng)編寫了一個PHP庫,您可以使用該庫向任何插件添加自動更新功能。公共,私人和商業(yè)插件都一樣–現(xiàn)在都可以享受自動更新通知和一鍵式升級的好處。
自定義更新檢查器與WordPress已內(nèi)置的升級系統(tǒng)緊密集成,可提供無縫的用戶體驗。觀察:


準備:
客戶端庫(需要WP 3.2或更高版本)
演示用插件
[zrz_file link="https://cdn.getimg.net/npc/2019/wordpress/plugin/external-update-example.zip" name="external-update-example.zip" code=""]實例元數(shù)據(jù)文件:
{
"name" : "External Update Example",
"slug" : "external-update-example",
"homepage" : "http://example.com/",
"download_url" : "http://w-shadow.com/files/external-update-example/external-update-example.zip",
"version" : "2.0",
"requires" : "4.0",
"tested" : "5.2",
"last_updated" : "2019-05-26 10:57:00",
"upgrade_notice" : "Here's why you should upgrade...",
"author" : "Janis Elsts",
"author_homepage" : "http://w-shadow.com/",
"sections" : {
"description" : "(Required) Plugin description. Basic HTML can be used in all sections.",
"installation" : "(Recommended) Installation instructions.",
"changelog" : "(Recommended) Changelog. <p>This section will be opened by default when the user clicks 'View version XYZ details'.</p>",
"custom_section" : "This is a custom section labeled 'Custom Section'."
},
"icons" : {
"1x" : "http://w-shadow.com/files/external-update-example/assets/icon-128x128.png",
"2x" : "http://w-shadow.com/files/external-update-example/assets/icon-256x256.png"
},
"banners" : {
"low" : "http://w-shadow.com/files/external-update-example/assets/banner-772x250.png",
"high" : "http://w-shadow.com/files/external-update-example/assets/banner-1544x500.png"
},
"rating" : 90,
"num_ratings" : 123,
"downloaded" : 1234,
"active_installs" : 12345
}
Github: https://github.com/YahnisElsts/plugin-update-checker
快速入門指南
本節(jié)描述了使自動更新適用于您的插件的最快方法。這是您需要做的:為插件創(chuàng)建一個元數(shù)據(jù)文件,將其托管在公共可訪問的位置,并告訴更新檢查器在哪里可以找到它。
讓我們從元數(shù)據(jù)開始。將下面的JSON代碼復制到新文件中,并將占位符值替換為插件的信息。
{
"name" : "My Cool Plugin",
"slug" : "my-cool-plugin",
"download_url" : "http://example.com/plugins/my-cool-plugin.zip",
"version" : "2.0",
"author" : "John Smith",
"sections" : {
"description" : "Plugin description here. Basic HTML allowed."
}
}
(這是進行自動更新所需的最少數(shù)據(jù)量。在大多數(shù)情況下,您可能需要添加幾個字段。有關完整列表,請參見元數(shù)據(jù)文檔。)
大多數(shù)字段應該是不言自明的,除了一個可能的例外-“子彈”。WordPress希望所有支持自動更新的插件都有一個唯一的文本標識符,稱為“ slug”。通常,子插件是由官方插件目錄分配的。對于在其他地方托管的私人/商業(yè)插件,您必須加以彌補。如果不確定,請使用不帶“ .php”擴展名的插件文件名(my-cool-plugin / my-cool-plugin.php成為my-cool-plugin)。
將您剛剛創(chuàng)建的元數(shù)據(jù)文件上傳到Web服務器。確切地將文件放在何處或如何命名都無關緊要。重要的是,無論有人在何處安裝您的插件,都可以訪問其URL。
接下來,將“ plugin-update-checker”目錄從客戶端庫存檔復制到您的插件目錄。然后啟動您喜歡的代碼編輯器,并將以下行添加到插件文件的頂部:
require 'plugin-update-checker/plugin-update-checker.php';
$MyUpdateChecker = PucFactory::buildUpdateChecker(
'http://example.com/path/to/metadata.json',
__FILE__,
'your-chosen-slug'
);
如果您按照我的建議使用插件的文件名作為子文件,則可以忽略PucFactory::buildUpdateChecker()
調(diào)用的第三個參數(shù)。
提示:有時您會遇到另一個活動插件也在使用此更新檢查器的情況。結(jié)果,可能會同時加載多個不同版本的庫。上面的代碼段將始終為您提供最新的可用版本。如果您的插件需要較舊的版本,并且與最新版本的API不兼容,則可能會出現(xiàn)問題。
要使用更新檢查器的特定版本(例如,插件隨附的版本),請PluginUpdateChecker_x_y
直接實例化該類。用主要和次要版本號替換x
和y
:
//Use version 2.0 of the update checker.
require 'plugin-update-checker/plugin-update-checker.php';
$MyUpdateChecker = new PluginUpdateChecker_2_0 (
'http://example.com/path/to/metadata.json',
__FILE__,
'your-chosen-slug'
);
信不信由你。
PluginUpdateChecker類將處理其余部分。它將每12小時檢查一次元數(shù)據(jù)文件,如果發(fā)現(xiàn)已發(fā)布了新版本,請在未記錄的WP API中旋轉(zhuǎn)正確的位,以使其在“插件”選項卡中顯示為標準升級通知。假設您提供了有效的download_url
,用戶只需單擊一下即可安裝更新。
提示:為更新創(chuàng)建ZIP文件時,請將所有插件文件放在目錄中。目錄名稱應與插件slug相匹配。請勿將文件放在ZIP歸檔文件的根目錄中-當有人綁定安裝更新時,它可能會引起細微的錯誤和錯誤。
本文的其余部分將專門討論更新檢查器類和元數(shù)據(jù)格式。
PluginUpdateChecker類
此類是更新檢查器的核心。這也是更新程序的唯一部分,除非您決定自己擴展該庫,否則它應該處理。
類構(gòu)造器
應該通過將所有配置設置傳遞給PucFactory :: buildUpdateChecker()工廠方法或直接傳遞給PluginUpdateChecker構(gòu)造函數(shù)來指定所有配置設置。兩者都采用以下參數(shù):
$metadataUrl
?–插件的元數(shù)據(jù)文件的完整URL。$pluginFile
–插件文件的路徑。在大多數(shù)情況下,您可以在此處簡單地使用__FILE__常量。$slug
–插件的“ slug”。如果未指定,則$ pluginFile的文件名部分(無“ .php”)將用作子文件。$checkPeriod
–檢查更新的頻率(以小時為單位)。默認為每12小時檢查一次。設置為零以禁用自動更新檢查。$optionName
–在何處存儲有關更新的簿記信息。默認為“ external_updates- $ slug”。
檢查更新()
手動觸發(fā)更新檢查。當您通過將$ checkPeriod(上方)設置為零來禁用自動檢查時,此功能特別有用。此方法不帶參數(shù),不返回任何值。
addQueryArgFilter($ callback)
注冊用于過濾查詢參數(shù)的回調(diào)。每當更新檢查器需要檢索元數(shù)據(jù)文件時,它將首先運行每個過濾器回調(diào),并將返回的查詢參數(shù)附加到元數(shù)據(jù)URL。這使您可以將任意數(shù)據(jù)傳遞到承載元數(shù)據(jù)的服務器。例如,商業(yè)插件可以使用它來實現(xiàn)某種授權方案,其中只有具有正確“密鑰”的用戶才能獲得自動更新。
回調(diào)函數(shù)將通過查詢參數(shù)的關聯(lián)數(shù)組傳遞,并應返回修改后的數(shù)組。默認情況下,更新檢查器會將以下參數(shù)添加到元數(shù)據(jù)URL:
installed_version
?–設置為當前安裝的插件版本。checking_for_updates
?–如果檢查更新,則設置為1,否則不設置(即,在為“插件信息”框加載數(shù)據(jù)時)。
此方法采用一個參數(shù)–回調(diào)函數(shù)。
addHttpRequestArgFilter($ callback)
注冊一個回調(diào),以過濾傳遞給內(nèi)置幫助器函數(shù)wp_remote_get的各種選項,更新檢查器使用該函數(shù)定期下載插件元數(shù)據(jù)。回調(diào)函數(shù)應采用一個參數(shù)-關聯(lián)的參數(shù)數(shù)組-并返回修改后的數(shù)組。有關可用的參數(shù)及其工作方式的詳細信息,請參見wp_remote_get上的WP文檔。
此方法采用一個參數(shù)–回調(diào)函數(shù)。
addResultFilter($ callback)
注冊一個回調(diào)以過濾從元數(shù)據(jù)URL檢索到的插件信息。
回調(diào)函數(shù)應帶有兩個參數(shù)。如果成功檢索了元數(shù)據(jù),則傳遞的第一個參數(shù)將是PluginInfo的實例(有關此類的說明,請參閱源代碼)。否則,它將為NULL。第二個參數(shù)是wp_remote_get的相應返回值(有關詳細信息,請參閱WP文檔)。回調(diào)函數(shù)應返回一個新的或修改的PluginInfo實例或NULL。
此方法采用一個參數(shù)–回調(diào)函數(shù)。
元數(shù)據(jù)格式
自動更新系統(tǒng)使用基于JSON的文件格式來描述插件。本質(zhì)上,整個文件是一個大的JSON編碼對象(AKA哈希表或關聯(lián)數(shù)組)。每個字段(或數(shù)組鍵)代表有關插件最新版本的一條信息。這里是所有可用字段的完整說明。
為了簡單起見,常規(guī)元數(shù)據(jù)和與更新相關的信息都存儲在同一文件中。如果不希望這樣做,則可以使用腳本替換純JSON文件,該腳本檢查“ checking_for_updates”查詢參數(shù)的存在,如果將其設置為“ 1”,則僅發(fā)出與更新相關的字段。
筆記
您的插件必須處于活動狀態(tài),更新才能正常工作。更新檢查器只是由您的插件加載并運行的另一段PHP代碼,如果插件處于非活動狀態(tài),則不會運行更新檢查器。
可能不會立即顯而易見的結(jié)果是,在多站點安裝中,僅當插件在主站點上處于活動狀態(tài)時才會顯示更新。這是因為更新通知通常會顯示在網(wǎng)絡管理員中,并且在這種情況下,只會加載主站點上活動的插件。WordPress網(wǎng)絡的主要站點是第一個創(chuàng)建的站點,并且在“?站點->所有站點”列表中具有路徑“ /”?。
來源于: https://w-shadow.com/blog/2010/09/02/automatic-updates-for-any-plugin/