如何仅对一个站点禁用启用网络的插件?


22

我正在建立一个(可能是)大型的多站点网络,并且我希望现在可以尽可能轻松地在需要时添加和配置站点。我目前正处在处理插件的阶段。

对于多站点,我知道可以激活插件的几种不同方式

  • 插入插件/plugins,在每个站点上单独激活它
  • 将插件放入/plugins,使用“网络激活”在所有站点上激活它
  • 将插件放入/mu-plugins,在每个站点上自动激活

现在,我一直在使用设置,我想在除一两个站点之外的所有站点上激活Akismet 。我以为我可以通过网络激活插件,然后在一个站点上将其禁用,但我无法这样做-如果我使用网络激活,则只有“网络停用”选项-可以在整个站点上停用插件所有网站。

有没有一种方法可以激活网络的便捷功能,但是仍然可以方便地逐站点停用插件?

Answers:


31

您可以使用过滤器site_option_*

例如,以下内容将禁用ID为2的博客上的akismet。

add_filter('site_option_active_sitewide_plugins', 'modify_sitewide_plugins');

function modify_sitewide_plugins($value) {
    global $current_blog;

    if( $current_blog->blog_id == 2 ) {
        unset($value['akismet/akismet.php']);
    }

    return $value;
}

1
+1提供干净的PHP级解决方案,无需安装额外的插件即可解决问题,因为我是位纯洁狂人,并且喜欢Wordpress尽可能干净且无插件!:]
trejder 2012年

1
将此代码放入PHP文件中mu-plugins,就像梦一样!
bgallagh3r 2015年

值得一提的是,这实际上不适用于主题。它需要尽快运行,因此mu-plugins是一个不错的选择。它可能作为插件运行,但是如果那也不起作用,我会为mu-plugins拍摄。
杰克

1
另外,此过滤器会运行很多,我会在取消设置之前检查数组中的索引是否已设置。第一次之后,它将继续尝试不存在该项目的数组。if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
杰克

1
在4.9.4上仍然可以正常工作。
杰克


3

这是在多站点/多主题安装中为某个特定主题禁用插件的方法。我在主题中的functions.php文件顶部添加了以下几行:

/**
 * Disable fancybox plugin for this theme, it breaks javascript
 */
function deactivate_plugin_conditional() {
    if ( is_plugin_active('fancybox-for-wordpress/fancybox.php') ) {
        deactivate_plugins('fancybox-for-wordpress/fancybox.php');
    }
}
add_action( 'muplugins_loaded', 'deactivate_plugin_conditional' );

我很确定这仅适用于mu插件,这是非常有限的。我会init像@GDR那样做。
杰克

2

活动插件存储在wp_ [blog_id] _sitemeta中字段“ active_plugins”和“ active_sitewide_plugins”中的wp_ [blog_id] _options中。这些是序列化的字段,因此除非您知道自己在做什么,否则请勿对其进行编辑。

还要看看wp-admin \ plugin.php。应该可以编写一个插件,该插件将使用其中声明的功能(例如is_plugin_active()和activate_plugin())来完成您想要的操作。

但是,我假设您精通PHP,但事实并非如此。


2

来自sorich87和user33465的答案不适用于Wordpress 4.3。将此添加到主题的functions.php的工作原理:

function deactivate_plugin_conditional() {
    $deactivated_plugin_name = 'lazy-load/lazy-load.php';
    deactivate_plugins($deactivated_plugin_name, false, true);
}
add_action( 'init', 'deactivate_plugin_conditional' );

我可以确认早先赞成的解决方案不再起作用,并且@gdr的解决方案确实起作用了。

我可以确认@ sorich87的解决方案在4.4.1中效果很好。你们并没有以明显的方式使用它,但仍然可以使用。但是,它可能只能在mu插件中工作,而绝对不能在主题中工作。此选项将在主题中起作用。但是请注意,这会强制停用与sorich87相对应的插件,该插件只会停止在网站上强制使用该插件,但如果需要,仍允许其正常使用。我更喜欢后者,但是它们两者都可能有用。
杰克

其实。如果您的站点是第一个站点(ID:1),则@ sorich87的解决方法无效。在这种情况下,将不允许您通过网络激活插件。其他任何ID似乎都可以使用。
杰克

而且这种方法对我也有相同的作用。如果主题为ID = 1的网站,则不能再在站点范围内激活该插件。–
Jake

0

WP 3中并没有开箱即用,但是我认为可以使用option_ *过滤器覆盖该选项。

另外,如果您在core.trac.wordpress.org中将建议添加为功能请求,那就太好了。



-1

我设法禁用了该插件,但仍在主站点面板上。我发现唯一将其从主站点中完全删除的解决方案是检查该站点插件的main.php并根据其禁用它:

global $current_blog;

// Only available to B
if( $current_blog->blog_id == 2 ) {


    define( 'AB_PATH', __DIR__ );

    include_once 'includes.php';

    //  plugin loaded stuff

    AB_Plugin::registerHooks();

    is_admin() ? new AB_Backend() : new AB_Frontend();

}
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.