深入瞭解WordPress自動更新

深入瞭解WordPress自動更新

談到安全性,我們知道定期更新WordPress安裝(核心、主題和外掛)的重要性,以及升級過程可能需要多長時間,尤其是當我們安裝了大量外掛時。通常建議按照以下步驟操作:

  1. 備份檔案和資料庫表
  2. 禁用外掛
  3. 更新
  4. 啟用外掛
  5. 檢查網站

對於單個網站來說,這可能是一項乏味的任務,而當我們必須更新五個、十個或更多網站時,這可能是一項煩人且複雜的工作。

為了提高安裝安全性和簡化站點管理的特定目的,WordPress 3.7引入了自動更新。預設情況下,這個很酷的功能是為次要版本(即維護和安全版本)和翻譯檔案啟用的,但可以自定義任何型別的更新。因此,在這篇文章中,我們將研究如何在新版本的WordPress核心、主題或外掛釋出時自動執行升級過程。讓我們深入瞭解WordPress自動更新!

WordPress自動更新

WordPress自動更新

WordPress自動更新

有四種型別的更新和WordPress自動更新

  1. 核心更新
  2. 外掛更新
  3. 主題更新
  4. 翻譯檔案更新

核心更新分為三個子型別:

  1. 核心開發(僅適用於開發安裝)
  2. 次要核心更新(維護和安全)——在穩定安裝中預設啟用
  3. 主要核心更新

WordPress 允許您為這些型別中的任何一種自動更新過程,提供兩個wp-config.php常量和大量API過濾器。

通過wp-config.php控制後臺更新

WordPress提供了幾個wp-config.php常量,允許我們控制自動更新。設定AUTOMATIC_UPDATER_DISABLED為true將禁用任何型別的自動升級:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
define( 'AUTOMATIC_UPDATER_DISABLED', true );
define( 'AUTOMATIC_UPDATER_DISABLED', true );
define( 'AUTOMATIC_UPDATER_DISABLED', true );

WP_AUTO_UPDATE_CORE允許我們控制核心更新(次要、主要和開發版本)。這個常數可以定義如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Disables all core updates:
define( 'WP_AUTO_UPDATE_CORE', false );
# Enables all core updates, including minor and major:
define( 'WP_AUTO_UPDATE_CORE', true );
# Enables minor updates:
define( 'WP_AUTO_UPDATE_CORE', 'minor' );
# Disables all core updates: define( 'WP_AUTO_UPDATE_CORE', false ); # Enables all core updates, including minor and major: define( 'WP_AUTO_UPDATE_CORE', true ); # Enables minor updates: define( 'WP_AUTO_UPDATE_CORE', 'minor' );
# Disables all core updates:
define( 'WP_AUTO_UPDATE_CORE', false );
# Enables all core updates, including minor and major:
define( 'WP_AUTO_UPDATE_CORE', true );
# Enables minor updates:
define( 'WP_AUTO_UPDATE_CORE', 'minor' );

在開發安裝中WP_AUTO_UPDATE_CORE預設為true。在穩定安裝中,它預設為次要。

為了完整起見,我應該提到一個額外的常量,它可以定義為禁用自動更新。但是,將其值設定為true將禁用任何檔案編輯,甚至主題和外掛安裝以及手動更新。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
define( 'DISALLOW_FILE_MODS', true );
define( 'DISALLOW_FILE_MODS', true );
define( 'DISALLOW_FILE_MODS', true );

相反,您可能更喜歡定義DISALLOW_FILE_EDITS常量,這將禁用檔案編輯器,但保證安裝和更新功能的安全。

相關教程:  wp-config.php 檔案——深入瞭解如何配置WordPress

通過API過濾器控制後臺更新

配置常量提供了啟用或禁用自動更新的通用方法。但是WordPress提供了許多過濾器,可以更深入地控制任何型別的更新。

注意:過濾器應該在外掛中使用,“必須使用外掛”是後臺更新的一個不錯的選擇。mu-plugins駐留在/wp-content內的特定資料夾中,並由WordPress自動啟用。這些外掛不會出現在WordPress外掛螢幕中,因此站點管理員不會意外禁用或刪除它們。如需更深入的瞭解,請參閱Codex文件

首先,通過automatic_updater_disabled過濾器返回true與AUTOMATIC_UPDATER_DISABLEDwp-config.php中將常量定義為true具有相同的效果:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
add_filter( 'automatic_updater_disabled', '__return_true' );
add_filter( 'automatic_updater_disabled', '__return_true' );
add_filter( 'automatic_updater_disabled', '__return_true' );

我們可以通過控制任何更新型別學auto_update_$type這使過濾器或禁用更新取決於價值$type'core''plugin''theme''translation')。

因此,我們可以通過auto_update_core過濾器返回true來自動化所有核心更新:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
add_filter( 'auto_update_core', '__return_true' );
add_filter( 'auto_update_core', '__return_true' );
add_filter( 'auto_update_core', '__return_true' );

在以下示例中,我們啟用了主題、外掛和翻譯的自動更新:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
add_filter( 'auto_update_theme', '__return_true' );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_translation', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' ); add_filter( 'auto_update_plugin', '__return_true' ); add_filter( 'auto_update_translation', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_translation', '__return_true' );

在上面的示例中,我們剛剛啟用了自動更新。但是這些過濾器讓我們可以更好地控制更新。在以下示例中,我們將自動更新兩個特定外掛:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function cb_auto_update_plugins ( $update, $item ) {
$plugins = array ( 'hello', 'akismet' );
if ( in_array( $item->slug, $plugins ) ) {
// update plugin
return true;
} else {
// use default settings
return $update;
}
}
add_filter( 'auto_update_plugin', 'cb_auto_update_plugins', 10, 2 );
function cb_auto_update_plugins ( $update, $item ) { $plugins = array ( 'hello', 'akismet' ); if ( in_array( $item->slug, $plugins ) ) { // update plugin return true; } else { // use default settings return $update; } } add_filter( 'auto_update_plugin', 'cb_auto_update_plugins', 10, 2 );
function cb_auto_update_plugins ( $update, $item ) {
$plugins = array ( 'hello', 'akismet' );
if ( in_array( $item->slug, $plugins ) ) {
// update plugin
return true; 
} else {
// use default settings
return $update; 
}
}
add_filter( 'auto_update_plugin', 'cb_auto_update_plugins', 10, 2 );

回撥函式保留兩個引數:

  1. $update: 設定是否更新的布林值;
  2. $item:更新offer物件。

該函式檢查要更新的專案是否在$plugins陣列中,然後相應地返回true或false。

最後,我們可以通過返回truefalse通過以下過濾器來區分開發、次要和主要更新:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
add_filter( 'allow_dev_auto_core_updates', '__return_false' );
add_filter( 'allow_minor_auto_core_updates', '__return_true' );
add_filter( 'allow_major_auto_core_updates', '__return_true' );
add_filter( 'allow_dev_auto_core_updates', '__return_false' ); add_filter( 'allow_minor_auto_core_updates', '__return_true' ); add_filter( 'allow_major_auto_core_updates', '__return_true' );
add_filter( 'allow_dev_auto_core_updates', '__return_false' );
add_filter( 'allow_minor_auto_core_updates', '__return_true' );
add_filter( 'allow_major_auto_core_updates', '__return_true' );

我們知道有時更新會失敗。在最壞的情況下,網站可能會在更新失敗後關閉。但幸運的是,我們可以要求WordPress在任何更新(或嘗試)後通過電子郵件通知我們。

結果、通知和除錯電子郵件

根據更新過程的結果,WordPress會向管理員地址傳送不同的電子郵件:

  • 在自動核心更新後傳送結果電子郵件;
  • 當WordPress無法執行自動更新時傳送通知電子郵件;
  • 除錯電子郵件在WordPress的開發版本中傳送。

每當自動更新成功或失敗時,WordPress都會傳送帶有以下主題之一的結果或通知電子郵件:

  • 您的網站已更新為WordPress XXX(案例成功)
  • WordPress XXX可用。請更新!(更新失敗,需要手動更新:案例失敗)
  • 緊急:您的網站可能因更新失敗而關閉(更新失敗且WordPress可能關閉:案例關鍵)

auto_core_update_send_email過濾器控制結果和通知郵件。可以通過false如下返回來禁用這些電子郵件:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
apply_filters( 'auto_core_update_send_email', '__return_false' );
apply_filters( 'auto_core_update_send_email', '__return_false' );
apply_filters( 'auto_core_update_send_email', '__return_false' );

特別是如果您計劃將自動更新擴充套件到主要核心和/或主題和外掛版本,您可能更願意啟用結果和通知電子郵件,或者根據結果或更新型別對其進行自定義。在以下示例中,如果成功,WordPress將不會傳送結果電子郵件:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
function cb_auto_core_update_send_email ( $send, $type, $core_update, $result ) {
if ( !empty( $type ) && $type == 'success' ) {
// don't send email
return false;
}
// use default settings
return $send;
}
}
add_filter( 'auto_core_update_send_email', 'cb_auto_core_update_send_email', 10, 4 );
function cb_auto_core_update_send_email ( $send, $type, $core_update, $result ) { if ( !empty( $type ) && $type == 'success' ) { // don't send email return false; } // use default settings return $send; } } add_filter( 'auto_core_update_send_email', 'cb_auto_core_update_send_email', 10, 4 );
function cb_auto_core_update_send_email ( $send, $type, $core_update, $result ) {
if ( !empty( $type ) && $type == 'success' ) {
// don't send email
return false; 
}
// use default settings
return $send; 
}
}
add_filter( 'auto_core_update_send_email', 'cb_auto_core_update_send_email', 10, 4 );

回撥函式保留以下引數:

  • $send 是一個布林值,用於確定是傳送結果還是通知電子郵件;
  • $type 是一個字串,用於設定要傳送的電子郵件型別(成功、失敗或關鍵);
  • $core_update 是更新報價物件;
  • $result 是核心更新的結果(可以是WP_Error)。

預設情況下,當從WordPress.org收到的更新提議設定特定標誌並且安裝無法更新時,管理員會收到通知。每個版本只會傳送一次通知電子郵件。send_core_update_notification_email過濾器允許在是否以及何時傳送此類通知方面有一定的自由裁量權。按如下方式應用過濾器:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
apply_filters( 'send_core_update_notification_email', '__return_true' );
apply_filters( 'send_core_update_notification_email', '__return_true' );
apply_filters( 'send_core_update_notification_email', '__return_true' );

最後,automatic_updates_send_debug_email過濾器控制除錯電子郵件,它提供有關執行更新的有用日誌資訊。預設情況下,這些電子郵件由開發安裝傳送。返回false將阻止WordPress傳送除錯電子郵件,而返回true將啟用這些電子郵件,即使在穩定安裝中:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
apply_filters( 'automatic_updates_send_debug_email', '__return_true' );
apply_filters( 'automatic_updates_send_debug_email', '__return_true' );
apply_filters( 'automatic_updates_send_debug_email', '__return_true' );

何時以及為何禁用WordPress自動更新

自動更新過程對許多使用者來說是一項很棒的功能,因為他們可以節省大量時間和工作。但即使看起來自動更新真的很安全,我們也應該問問自己,啟用所有這些是否總是一個好主意。

有時,我們可能會遇到主題和外掛的不相容問題,這可能會中斷某些功能甚至破壞網站。如果網站依賴於大量外掛,則執行手動更新可能更安全,至少對於外掛而言。一對一的過程使我們能夠快速檢測自動化難以發現的問題。

此外,如果您是一名開發人員,即使您不打算分發它們,您也應該小心為主題和外掛選擇的名稱。執行更新時,WordPress 會在外掛目錄中查詢外掛的新版本,並在找到同名外掛時覆蓋檔案。因此,如果您想為主題和外掛啟用後臺更新,請務必為您的指令碼設定唯一的名稱。

是的,這對開發人員來說是很多好東西。但是非開發人員使用者如何管理自動更新?

使用外掛控制WordPress自動更新

如果您不是開發人員,則可以使用外掛控制WordPress自動更新。

Easy Updates Manager允許管理員使用者在單站點和多站點安裝上控制WordPress更新。該外掛允許管理WordPress更新的所有型別,並且可以單獨選擇主題和外掛進行自動更新。附加功能與通知電子郵件、使用者阻止和記錄外掛更新有關。

Easy Updates Manager外掛

Easy Updates Manager外掛

在不相容的情況下,可能需要快速恢復到主題或外掛的先前版本。WP Rollback允許您從外掛螢幕恢復任何已安裝主題和外掛的先前版本。只需單擊回滾連結,外掛就會向您顯示所有可用版本的列表。不幸的是,如果您的網站出現故障,WP回滾將無濟於事,所以不要忘記備份並仔細閱讀線上文件。

WP Rollback外掛

WP Rollback外掛

最後,如果您需要對WordPress安裝中的自動更新進行相容性測試,Background Update Tester將提供您需要的資訊。

高階外掛和主題的自動更新

作為高階WordPress外掛或主題的開發人員,您有責任將自動更新機制整合到您的產品中,以提供使用者對WordPress.org產品所期望的無縫更新體驗。這已成為當今的市場標準(有充分的理由)。您可以自己託管高階產品並開發更新機制,或利用FreemiusKernlWP Updates等平臺,這些平臺提供安全的儲存庫和開箱即用的自動更新即服務。

小結

WordPress自動更新是一項很棒的功能,可以為我們節省大量時間和工作,並使我們能夠定期更新我們的網站。但是你會啟用各種更新嗎?請在下面的評論中告訴我們。

評論留言