如果手动更新插件或主题过程失败,回滚功能将自动恢复以前安装的版本,以确保网站仍然可供用户使用。
回滚功能起源于#51857。
更新插件或主题时,旧版本的插件或主题将移动到wp-content/upgrade-temp-backup/plugins/PLUGINNAME
或wp-content/upgrade-temp-backup/themes/THEMENAME
文件夹。
我们选择移动而不是 zip 压缩的原因是因为压缩/解压缩是资源密集型过程,并且可能会增加低端共享主机上的失败风险。另一方面,移动文件是立即执行的,不会成为瓶颈。
移动是通过 WordPress 6.2 中包含的新move_dir()
功能来完成的。PHP的 rename()
是用于此目的,并回退到copy_dir(),WordPress 内核长期以来使用此方法来递归文件副本。move_dir()::move()
使用 WP_Filesystem_Direct、 WP_Filesystem_FTPext、 WP_Filesystem_ftpsockets和 WP_Filesystem_SSH2文件系统抽象的方法 ,并有一个回退到 copy_dir()
. 在开发笔记中了解 move_dir()
更多信息。
如果更新过程失败,那么我们在“upgrade-temp-backup”文件夹中移动的备份将恢复到其原始位置。如果更新成功,则删除备份。
站点运行状况屏幕中添加了两项新检查:
- 检查并确保备份文件夹可写。
- 检查是否有足够的可用磁盘空间来安全地执行更新。
为避免混淆:成功更新后,“upgrade-temp-backup”文件夹将不会用于将插件“回滚”到以前的版本。您可以为此使用各种回滚插件。
“upgrade-temp-backup”文件夹将仅包含先前安装的正在更新的插件或主题的临时备份,更新过程完成后,该文件夹将被清空。
当发生回滚时,用户应该只是看到有一个更新待处理,并且他们的站点应该仍然可以工作。
对于导致手动更新失败和回滚的最简单解释是从 WP_Upgrader::install_package()
返回的任何 WP_Error
内容。
- 错误的请求,缺少更新的源或目标。
- 一个
WP_Error
从upgrader_pre_install
,upgrader_source_selection
,upgrader_clear_destination
,upgrader_post_install
过滤器返回。 - 一个空的下载包。
- 将已安装的插件/主题移动到临时备份目录时失败。
- 如果无法清除远程源目标文件夹并且存在某些内容。
- 无法创建远程目标文件夹。
- 无法将更新移动/复制到远程目标。
以上包含回滚功能的第 1 部分和第 2 部分。第 3 部分(希望适用于 WordPress 6.4)是相同的过程,但用于自动更新。具体来说,回滚第 3 部分会检查更新的插件在激活时是否不会导致 PHP 致命错误。如果是这样,则会捕获此错误并恢复以前安装的版本。
所有回滚功能(第 1-3 部分)都包含在回滚更新失败 功能插件中用于测试。