Como desativar um plug-in habilitado para rede para apenas um site?

22

Estou no processo de configurar uma rede multisite (potencialmente) grande e pretendo facilitar ao máximo a adição e a configuração de sites, quando necessário. Atualmente, estou na fase em que estou lidando com plugins.

Com o multisite, conheço várias maneiras diferentes de ativar plugins

  • Coloque o plug-in /plugins, ative-o em todos os sites invidualmente
  • Coloque o plug-in /plugins, use 'rede ativar' para ativá-lo em todos os sites
  • Coloque o plug-in /mu-plugins, ativado automaticamente em todos os sites

Agora, estou brincando com as configurações e quero ativar o Akismet em todos os sites, exceto um ou dois. Eu pensei que seria capaz de ativar o plug-in em rede e depois desabilitá-lo em um único site, mas não consigo fazê-lo - se eu usar o network ativar, há apenas a opção de 'desativar a rede' - que desativa o plug-in. todos os sites.

Existe uma maneira de ativar a funcionalidade útil da rede, mas ainda assim ter a conveniência de poder desativar plug-ins site por site?

ninguém
fonte

Respostas:

31

Você pode usar o filtro site_option_*.

Por exemplo, o seguinte desabilitará o akismet no blog com o ID 2.

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;
}
sorich87
fonte
1
+1 por fornecer uma solução limpa em nível de PHP que resolve o problema em questão sem a necessidade de instalar um plug-in extra - porque sou um maníaco pela pureza e amo o Wordpress o mais limpo e sem plug-ins possível! :]
Trejder
1
Soltou esse código em um arquivo PHP mu-pluginse funciona como um sonho!
precisa saber é o seguinte
É bom observar que isso realmente não funciona em um tema. Ele precisa ser executado mais cedo, portanto, o mu-plugins é um ótimo lugar para isso. Pode ser executado como um plug-in, mas eu usaria mu-plugins se isso também não funcionar.
Jake
1
Além disso, este filtro é executado muito, gostaria de verificar se o índice na matriz está definido antes de desmarcá-lo. Após a primeira vez, ele continuará tentando uma matriz onde esse item não existe. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
Jake
1
Isso ainda está funcionando muito bem na 4.9.4.
Jake
3

Este plugin: http://firestats.cc/wiki/WPMUPluginCommander

ignora o material de ativação de rede e faz o seu próprio. e permite desativar o plug-in site por site.

Atualização: parece que este plug-in quebra o plug-in de tags em todo o site, portanto, tenha cuidado antes de tentar em uma rede de produção.

andrea_r
fonte
wordpress.org/plugins/plugin-commander - URL alterado. Embora este plugin não foi atualizado nos últimos anos neste momento ...
Jake
3

Aqui está o que funcionou para desabilitar um plug-in para um tema específico em uma instalação multisite / multitheme. Adicionei essas poucas linhas na parte superior do arquivo functions.php no meu tema:

/**
 * 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' );
user33465
fonte
Tenho certeza que isso só funcionará em mu-plugins, o que é bastante limitador. Eu faria isso initcomo @GDR.
Jake
2

Os plug-ins ativos são armazenados nas opções wp_ [blog_id] no campo 'active_plugins' e 'active_sitewide_plugins' em wp_ [blog_id] _sitemeta. Estes são campos serializados, portanto, não os edite, a menos que você saiba o que está fazendo.

Veja também wp-admin \ plugin.php. Deve ser possível escrever um plug-in que faça o que você deseja usando as funções declaradas nele, por exemplo, is_plugin_active () e enable_plugin ().

No entanto, estou supondo que você seja proficiente em PHP, o que pode não ser o caso.

codecowboy
fonte
2

As respostas de sorich87 e user33465 não funcionaram para mim com o Wordpress 4.3. Adicionando isso ao functions.php do tema funcionou:

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' );
RDA
fonte
Posso confirmar que as soluções aprovadas anteriormente não funcionam mais e que a solução do @gdr realmente funciona.
Posso confirmar que a solução do @ sorich87 funciona muito bem no 4.4.1. Vocês não estão usando isso de uma maneira que funciona aparentemente, mas ainda funciona. No entanto, provavelmente só pode funcionar em mu-plugins e definitivamente não no tema. Esta opção funcionará em temas. Mas observe que isso força um plug-in desativado contra o sorich87, que apenas para de forçá-lo no site, mas ainda permite que ele seja usado normalmente, se desejado. Eu prefiro o último, mas ambos podem ser úteis.
Jake
Na realidade. O método de solução da @ sorich87 não funciona se o seu site for o primeiro (ID: 1). Se for esse o caso, não permitirá que você ative o plug-in em rede. Qualquer outro ID parece funcionar.
Jake
E esse método faz a mesma coisa para mim. Você não pode ativar o site inteiro plug-in (s) se este é do tema para o site em ID = 1.
Jake
0

Não está pronto para uso no WP 3, mas acho que seria possível substituir a opção usando os filtros option_ *.

Além disso, seria ótimo se você adicionasse a sugestão como uma solicitação de recurso no core.trac.wordpress.org.

Denis de Bernardy
fonte
-1

Consegui desativar o plug-in, mas ele ainda estava no painel principal do site. A única solução que encontrei para removê-lo completamente do site principal foi verificar o main.php do plugin no site e desativá-lo de acordo com ele:

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();

}
NetOholik
fonte