在执行WP-CLI时如何防止插件加载?


13

我目前在主插件文件本身中使用此代码。但是该插件不是我自己的,因此我希望能够正常升级而不需要每次都添加此代码。

if ( defined( 'WP_CLI' ) && WP_CLI ) {
    exit;
}

我需要执行此操作,因为此插件会产生错误并停止wp-cli才能正确执行,因此我不能仅使用wp-cli禁用该插件,执行我的任务并重新启用它。

有没有办法可以if x then do not load plugin file x从mu插件中执行类似的操作?

Answers:


13

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获取活动插件列表以加载要禁用的插件时,将从该列表中过滤掉。


有相同的想法,但这是行不通的。至少不在我的本地环境中。get_option()将值保存在瞬态/类似值中并跳过此过滤器时,也许会提早返回?(在大多数情况下不起作用,仅在管理员插件屏幕中实际上已执行)
kero

嗯 查看源代码,据我所知,option_不应用过滤器的唯一原因是它没有值,并且正在返回默认值。
雅各布·皮蒂

实际上就是这种情况(没有插件处于活动状态)。我不应该保持测试环境太干净..
kero

1
我接受了这一点,因为就我而言,这正是我所需要的。即使总的来说,--skip-plugin=x选择wp-cli可能是一种更好的方法。
NextGenThemes

15

使用skip-pluginsWP-CLI时,可以使用WP-CLI中的选项不加载单个插件。

您可以在以下命令中使用它:

wp user list --skip-plugins=my-plugin

或者,您可以将其添加到wp-cli.yml文件中:

skip-plugins:
- my-plugin

-1

只是重命名插件目录名称将禁用它。有时我会暂时禁用插件[linux]:

mv my-plugin-dir renamed-my-plugin-dir

OP希望仅在使用WP-CLI时跳过该插件,而不希望同时进行其他任何活动
Mark Kaplun '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.