Answers:
WordPress加载插件的第一件事之一是获取保存在数据库中的活动插件:
$active_plugins = (array) get_option( 'active_plugins', array() );
由于get_option()
使用了它,因此我们可以使用option_active_plugins
过滤器动态修改活动插件列表。
function wpse_301282_disable_plugin( $active_plugins ) {
if ( defined( 'WP_CLI' ) && WP_CLI ) {
$key = array_search( 'gravityforms/gravityforms.php', $active_plugins );
if ( $key ) {
unset( $active_plugins[$key] );
}
}
return $active_plugins;
}
add_filter( 'option_active_plugins', 'wpse_301282_disable_plugin' );
只需替换gravityforms/gravityforms.php
为要禁用的插件的目录和文件名即可。
这里的问题是我们试图影响插件的加载,因此我们不能从插件内部进行加载,因为为时已晚。在主题上也为时已晚。
幸运的是,WordPress具有“必须使用的插件”,您可以添加这些插件,这些插件会在常规插件之前和单独加载,并且不会出现在常规插件列表中。
将此代码添加到“必须使用的插件”中,您要做的就是创建一个wp-content/mu-plugins
目录(如果尚不存在),并创建一个包含该代码的PHP文件(可以称为任何文件)。您不需要插件标头或其他任何内容。
现在,当WordPress加载时,该代码将在所有其他插件之前加载。由于我们的过滤器已经安装到位,因此当WP-CLI处于活动状态时,当WordPress获取活动插件列表以加载要禁用的插件时,将从该列表中过滤掉。
option_
不应用过滤器的唯一原因是它没有值,并且正在返回默认值。
--skip-plugin=x
选择wp-cli可能是一种更好的方法。
使用skip-plugins
WP-CLI时,可以使用WP-CLI中的选项不加载单个插件。
您可以在以下命令中使用它:
wp user list --skip-plugins=my-plugin
或者,您可以将其添加到wp-cli.yml
文件中:
skip-plugins:
- my-plugin
只是重命名插件目录名称将禁用它。有时我会暂时禁用插件[linux]:
mv my-plugin-dir renamed-my-plugin-dir
get_option()
将值保存在瞬态/类似值中并跳过此过滤器时,也许会提早返回?(在大多数情况下不起作用,仅在管理员插件屏幕中实际上已执行)