问题描述
在 Twitter 讨论之后,似乎 wordpress.org 有能力将插件的安全更新推送到没有 opt-in 的站点来接收自动插件更新。任何人都可以解释它的理性,我该如何阻止这种更新?
另一方面,这个功能是否受”magic” 限制到 wordpress.org,或者我可以使用相同的机制来更新从我自己的服务器分发的插件和主题,同时仍然符合 wordpress 内核的一般更新过程和规则 (显然在我的代码中,我可以绕过所有内容来触发更新,问题是如何通过设置常量或各种与更新相关的过滤器的使用来表达最佳用户期望。
最佳解决方案
回答第一个问题…
如果您在 wp-admin /includes /class-wp-upgrader.php 中找到的 WP_Automatic_Updater 类中查看,我们注意方法 is_disabled,由方法 should_update 用于确定是否允许自动更新。
在以下条件下,is_disabled
方法将返回 true,
-
如果定义了
DISALLOW_FILE_MODS
常数,并且是true
-
如果定义
WP_INSTALLING
常数,而不考虑值状态 -
如果
AUTOMATIC_UPDATER_DISABLED
常数定义为true
请注意,后一个常数 AUTOMATIC_UPDATER_DISABLED
也与过滤器 automatic_updater_disabled
相关联,因此即使定义了该值,也可以在其他地方过滤该值,在这种情况下,您最好通过声明以下钩来进行服务:
add_filter( 'automatic_updater_disabled', '__return_true' );
以下是 WP_Automatic_Updater
类的摘录方法:
wp-admin/includes/class-wp-upgrader.php:1730
/**
* Whether the entire automatic updater is disabled.
*
* @since 3.7.0
*/
public function is_disabled() {
// Background updates are disabled if you don't want file changes.
if ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS )
return true;
if ( defined( 'WP_INSTALLING' ) )
return true;
// More fine grained control can be done through the WP_AUTO_UPDATE_CORE constant and filters.
$disabled = defined( 'AUTOMATIC_UPDATER_DISABLED' ) && AUTOMATIC_UPDATER_DISABLED;
/**
* Filter whether to entirely disable background updates.
*
* There are more fine-grained filters and controls for selective disabling.
* This filter parallels the AUTOMATIC_UPDATER_DISABLED constant in name.
*
* This also disables update notification emails. That may change in the future.
*
* @since 3.7.0
*
* @param bool $disabled Whether the updater should be disabled.
*/
return apply_filters( 'automatic_updater_disabled', $disabled );
}
我会进一步建议阅读以下链接:
配置自动背景更新
http://codex.wordpress.org/Configuring_Automatic_Background_Updates
… 详细提供了可用的常量和过滤器的列表,用于细粒度控制要禁用更新的组件。
对于仅禁用自动插件更新的情况,您有:
add_filter( 'auto_update_plugin', '__return_false' );
… 等等。
回答你的第二个问题
(有人对我错,如果我错了)
我们为读者添加一些上下文,这个整个问题是这个 twitter status 的结果,这本身就是对强力自动更新 Yoast 的 WP SEO 插件的一个回应,请参阅以下 https://yoast.com/wordpress-seo-security-release/,以获取更多信息。
wp-includes/update.php
中有一个名为 wp_maybe_auto_update
的函数,该函数在同一个文件中包含的 wp_version_check
函数中从 do_action('wp_maybe_auto_update')
函数中引发的名称为 do_action('wp_maybe_auto_update')
的钩子,该函数本身是每天运行两次的计划事件。
所以,我怀疑 WordPress.org 的做法是,他们内部增加了 WordPress 的版本,这样自动更新将被强制用户使用,因为与安卓 WP SEO 插件有关的安全漏洞的严重程度。
对于 quote 他自己:
Because of the severity of the issue, the WordPress.org team put out a forced automatic update (thanks!)
我不是 100%肯定这是否实际上也自动更新任何其他插件在 WordPress.org 存储库中有新版本,或者 WordPress.org 是否可以指定哪些插件可能是从他们的结尾可以是 auto-updated,也许有些东西在代码也允许这种类型的自由裁量权。
至于您是否可以自己使用相同的机制,那么对于您在 WordPress.org 资源库中托管的插件,是的,对于官方存储库之外的用户,我并不完全确定,但您可以实例化 WP_Automatic_Updater 类,并提供一个上下文来检查,但我认为最终我们最终会在 wp-includes /update.php 中的功能称为 wp_update_plugins,它检查官方的 WordPress 存储库 API 。
我可能不正确,如果有人有进一步的东西添加,请进来。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。