Uma das primeiras coisas que o WordPress faz para carregar plug-ins é obter os plug-ins ativos salvos no banco de dados:
$active_plugins = (array) get_option( 'active_plugins', array() );
Como ele usa get_option()
, podemos usar o option_active_plugins
filtro para modificar a lista de plugins ativos em tempo real.
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' );
Basta substituir gravityforms/gravityforms.php
pelo diretório e nome do arquivo do plug-in que você deseja desativar.
O problema aqui é que estamos tentando afetar o carregamento de plug-ins, então não podemos fazer isso de dentro de um plug-in, porque é tarde demais. No tema também seria tarde demais.
Felizmente, o WordPress tem "Plug-ins de uso obrigatório". Esses plug-ins podem ser adicionados antes e separadamente dos plug-ins comuns e não aparecem na lista de plug-ins comuns.
Tudo o que você precisa para adicionar esse código a um Plug-in Must Use é criar um wp-content/mu-plugins
diretório (se ele ainda não existir) e criar um arquivo PHP (pode ser chamado de qualquer coisa) com esse código. Você não precisa de um cabeçalho de plug-in ou qualquer outra coisa.
Agora esse código será carregado antes de todos os outros plugins quando o WordPress carregar. Como nosso filtro está em vigor, quando o WordPress obtiver a lista de plug-ins ativos para carregar o plug-in que você deseja desativar, será filtrado dessa lista se o WP-CLI estiver ativo.
get_option()
esteja retornando mais cedo quando o valor for salvo em transientes / similar e esse filtro for ignorado? (Não funciona para a maioria dos casos, apenas na tela de administração do plugin que realmente foi executado)