问题描述
有一个 opt-in 过滤器,允许我的站点上的所有插件接收自动更新:
add_filter( 'auto_update_plugin', '__return_true' );
我喜欢这个功能,但我不希望自动更新我的所有插件。如何自动更新一些插件,而不需要手动更新?
最佳解决方案
而不是使用 functions.php 中的问题的代码替换为:
/**
* Prevent certain plugins from receiving automatic updates, and auto-update the rest.
*
* To auto-update certain plugins and exclude the rest, simply remove the "!" operator
* from the function.
*
* Also, by using the 'auto_update_theme' or 'auto_update_core' filter instead, certain
* themes or WordPress versions can be included or excluded from updates.
*
* auto_update_$type filter: applied on line 1772 of /wp-admin/includes/class-wp-upgrader.php
*
* @since 3.8.2
*
* @param bool $update Whether to update (not used for plugins)
* @param object $item The plugin's info
*/
function exclude_plugins_from_auto_update( $update, $item ) {
return ( ! in_array( $item->slug, array(
'akismet',
'buddypress',
) ) );
}
add_filter( 'auto_update_plugin', 'exclude_plugins_from_auto_update', 10, 2 );
此代码也可以轻松调整,以自定义主题和核心更新。
插件和主题更新统计信息添加到 Wordpress 3.8.2(27905) 中。上述功能使用 slug 来识别插件,但您可以使用任何对象的信息 ($ item):
[id] => 15
[slug] => akismet
[plugin] => akismet/akismet.php
[new_version] => 3.0.0
[url] => https://wordpress.org/plugins/akismet/
[package] => https://downloads.wordpress.org/plugin/akismet.3.0.0.zip
对于 Wordpress 3.8.1 及更低版本,请使用此功能:
function exclude_plugins_from_auto_update( $update, $item ) {
return ( ! in_array( $item, array(
'akismet/akismet.php',
'buddypress/bp-loader.php',
) ) );
}
add_filter( 'auto_update_plugin', 'exclude_plugins_from_auto_update', 10, 2 );
道具去 @ WiseOwl9000 指出 WP 3.8.2 的变化
次佳解决方案
注意从 wordpress 3.8.2 传递给此函数的插件项的类型已更改,现在它是一个对象。
/**
* @package Plugin_Filter
* @version 2.0
*/
/*
Plugin Name: Plugin Filter
Plugin URI: http://www.brideonline.com.au/
Description: Removes certain plugins from being updated.
Author: Ben Wise
Version: 2.0
Author URI: https://github.com/WiseOwl9000
*/
/**
* @param $update bool Ignore this it just is set to whether the plugin should be updated
* @param $plugin object Indicates which plugin will be upgraded. Contains the directory name of the plugin followed by / followed by the filename containing the "Plugin Name:" parameters.
*/
function filter_plugins_example($update, $plugin)
{
$pluginsNotToUpdate[] = "phpbb-single-sign-on/connect-phpbb.php";
// add more plugins to exclude by repeating the line above with new plugin folder / plugin file
if (is_object($plugin))
{
$pluginName = $plugin->plugin;
}
else // compatible with earlier versions of wordpress
{
$pluginName = $plugin;
}
// Allow all plugins except the ones listed above to be updated
if (!in_array(trim($pluginName),$pluginsNotToUpdate))
{
// error_log("plugin {$pluginName} is not in list allowing");
return true; // return true to allow update to go ahead
}
// error_log("plugin {$pluginName} is in list trying to abort");
return false;
}
// Now set that function up to execute when the admin_notices action is called
// Important priority should be higher to ensure our plugin gets the final say on whether the plugin can be updated or not.
// Priority 1 didn't work
add_filter( 'auto_update_plugin', 'filter_plugins_example' ,20 /* priority */,2 /* argument count passed to filter function */);
$ plugin 对象具有以下内容:
stdClass Object
(
[id] => 10696
[slug] => phpbb-single-sign-on
[plugin] => phpbb-single-sign-on/connect-phpbb.php
[new_version] => 0.9
[url] => https://wordpress.org/plugins/phpbb-single-sign-on/
[package] => https://downloads.wordpress.org/plugin/phpbb-single-sign-on.zip
)
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。