Desativar ação de plug-in / plug-in por tema

19

Eu instalei o plug - in do Google Analyticator no meu site. Também estou usando o plug - in MobilePress para exibir um tema projetado para navegadores de celular que não são smartphones. Configurei o Google Analytics para celular para uso neste tema e gostaria de desativar o plug-in do Analyticator, pois inclui uma chamada para um arquivo js maior.

Alguém sabe se é possível desativar um plugin usando o functions.php ou algum outro método?

Acredito que localizei o código que adiciona as funções à página. Portanto, se não for possível desativar todo o plug-in, é possível interromper as ações para execução? Eu tentei desativá-los diretamente, sem sorte. Aqui está o código do arquivo de plug-in:

add_action('wp_head', 'add_google_analytics', 999999);
add_action('init', 'ga_outgoing_links');

Tentei remover essas ações com:

remove_action('wp_head','add_google_analytics',9999999);
remove_action('init', 'ga_outgoing_links');

Qualquer ajuda é muito apreciada.

PNMG
fonte
Quanto a mim, isso deve estar funcionando tecnicamente; portanto, há alguma coisa sobre o tempo de execução desse código que der errado (muito cedo ou muito tarde). Forneça mais informações.
Rarst
Sim, eu pensei que iria funcionar também. Não tenho muita experiência com ações de adição / remoção, por isso não tinha certeza de como depurar mais. Embora a resposta da EAMann tenha funcionado, que tipo de informação você estava procurando?
PNMG 15/03
Estou um pouco confuso - não é mais fácil desabilitar o plug-in por meios normais, se ele precisar desaparecer definitivamente? Qual resposta da EAMann faz apenas por código. Eu achei que você queria-lo dinamicamente com deficiência em alguma condição ...
Rarst
Eu tenho um tema regular que é definido no wordpress para qualquer navegador de desktop normal. Para esse tema, quero usar o plug-in do GA. O plug-in mobilepress usa php para obter a string user-agent e serve um tema diferente para um telefone inteligente ou um telefone não-inteligente. Eu queria usar o arquivo functions.php para o tema de telefones não inteligentes para desativar o plug-in do GA colocando o JS na <head> apenas para esse tema. Ele ainda precisa estar ativado para os outros dois temas (desktop e smartphone). Isso ajuda a esclarecer?
PNMG 15/03
Sim, foi o que pensei. Mas a desativação apenas desativará o plug-in persistentemente e permanecerá desativada até ser ativada explicitamente. Não acho que seja adequado ao seu caso de uso.
Rarst 16/03/2019

Respostas:

25

Quando o WordPress ativa um plug-in, ele chama a activate_plugin()função Essa função ativa o plug-in em uma sandbox e redireciona para outro lugar com sucesso. Ele foi usado por alguns autores para ativar programaticamente dependências de plugins.

Há outra função, deactivate_plugin()que faz uma coisa semelhante ao contrário ... é como o WordPress desativa os plug-ins quando você clica em "desativar" ou "desativar".

Para desativar um plug-in instalado, basta ligar para:

deactivate_plugins( '/plugin-folder/plugin-name.php' );

Ou, para desativar vários plugins de uma vez:

deactivate_plugins( array( '/first-plugin/first.php', '/second-plugin/second.php' ) );

Há um segundo parâmetro (o primeiro é uma sequência de caracteres ou uma matriz dos plug-ins a serem desativados) que permite desativar os plug-ins sem chamar ganchos de desativação. Por padrão, está definido como false, e eu recomendo que você deixe assim. A menos que, por algum motivo, você queira ignorar a desativação, faça:

deactivate_plugins( '/plugin-folder/plugin-name.php', true );

Isso desativaria o plug-in, mas não dispararia nada que o plug-in registrado fizesse na desativação. Portanto, se o plug-in remover opções ou tabelas db quando estiver desativado, faça essa desativação "silenciosa" para preservar essas informações e usá-las em outros lugares.

EAMann
fonte
Ótima resposta - e não apenas comparada a outra, digamos, resposta sem brilho "aqui está um site" que pode estar em algum lugar próximo.
editor de
Esse código, colocado no functions.php, desativará o plug-in no administrador, desativando-o dos outros dois temas. Obrigado Rarst por apontar isso. Eu estava querendo apenas desativá-lo para o tema em que o arquivo functions.php estava localizado.
PNMG
Você está sempre usando um tema de cada vez em um determinado site ... mas se você deseja reativar o plug-in depois de desativar o tema, isso também é possível.
EAMann
11

Isso se deve à brilhante resposta de EAMann acima, e achei que também poderia ser útil para o pôster original ...

Eu precisava de uma solução para garantir que os usuários desativassem meu plug-in se eles fizessem o upload da versão premium (para evitar possíveis conflitos). Anteriormente, eu detectei seu estado com is_plugin_active e mostrei uma mensagem de erro de administrador para solicitar aos usuários que o desligassem. Isso é MUITO mais suave ...

function deactivate_plugin_conditional() {
    if ( is_plugin_active('plugin-folder/plugin-name.php') ) {
    deactivate_plugins('plugin-folder/plugin-name.php');    
    }
}
add_action( 'admin_init', 'deactivate_plugin_conditional' );

Nota: Não parecia funcionar no register_activation_hook, mas o admin_init funciona como um encanto.

Mark Jeldi
fonte
11
Apenas a nota eu tenho certeza is_plugin_active já está marcada no gancho deactivate_plugins por isso não precisa fazê-lo novamente
Bryan Willis
1

Aqui está a minha solução, crie um plug-in que pode desativar outros plugins, como:

/*
 * Plugin Name: Disable/Configure Plugins
 * Description: Lets you disable/configure plugins based on environment variables
 * Author:      Chris Sewell
 */

/**
 * Disable specified plugins in development environment.
 * 
 * This is a "Must-Use" plugin. Code here is loaded automatically before regular plugins load.
 * This is the only place from which regular plugins can be disabled programatically.
 * 
 * Place this code in a file in WP_CONTENT_DIR/mu-plugins or specify a custom location 

 * to "development" or "production" in each particular server/environment.
 */

/* Disable specified plugins in development environment */
if (((getenv('environment') == 'production') || (getenv('environment') == 'alpha')) == false) {
    $plugins = array(
        'w3-total-cache/w3-total-cache.php'
    );
    require_once(ABSPATH . 'wp-admin/includes/plugin.php');
    deactivate_plugins($plugins);
}

Envie isso para produção, ative-o e traga o banco de dados para a máquina de desenvolvimento local.

Fonte

user128526
fonte