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

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


/plugins中的插件,在每个站点上分别激活
,将插件放在/plugins中,使用“网络激活”在所有站点上激活,
/mu-plugins中的插件放置,在每个站点上自动激活

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

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

#1 楼

您可以使用过滤器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提供了干净的PHP级解决方案,无需安装额外的插件即可解决问题,因为我是一位纯洁的狂热者,并且喜欢Wordpress,它尽可能干净且无插件! :]

– Trejder
2012年11月12日10:14

将此代码放在mu-plugins的PHP文件中,就像梦一样!

–bgallagh3r
2015年12月4日,12:02

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

–杰克
16年1月7日在4:24



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

–杰克
18-2-14在22:29

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

–杰克
18-2-20在5:41

#2 楼

此插件:
http://firestats.cc/wiki/WPMUPluginCommander

绕过网络激活工作并自行执行。并允许您逐站点在站点上禁用该插件。

更新:该插件看起来破坏了站点范围标签插件,因此在尝试生产网络之前请务必小心。

评论


wordpress.org/plugins/plugin-commander-网址已更改。尽管此插件多年来尚未更新...

–杰克
16年1月7日在4:38



#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插件,这是非常有限的。我会像@GDR这样在init上执行此操作。

–杰克
16年1月7日,下午4:35

#4 楼

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

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

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

#5 楼

在Wordpress 4.3中,来自sorich87和user33465的答案对我不起作用。将此添加到主题的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的解决方案确实起作用。

–user2015
2015年10月23日3:00



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

–杰克
16年1月7日,下午4:31

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

–杰克
18-2-20在5:42



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

–杰克
18-2-20在5:54

#6 楼

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

此外,如果您将建议添加为功能将很不错。在core.trac.wordpress.org中请求。

#7 楼

处理多站点网络中所有插件的更好方法是在此处找到“ Plugin Commander”:http://wordpress.org/extend/plugins/plugin-commander/

#8 楼

我设法禁用了该插件,但仍在主站点面板上。
我发现唯一将其从主站点完全删除的解决方案是检查该站点的插件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();

}