Como evito que um plug-in seja carregado ao executar o WP-CLI?

12

Atualmente, uso esse código no próprio arquivo principal de plug-ins. Mas esse plug-in não é o meu, então eu preferiria poder atualizá-lo normalmente sem sempre adicionar esse código.

if ( defined( 'WP_CLI' ) && WP_CLI ) {
    exit;
}

Preciso fazer isso porque esse plug-in produz erros e interrompe a execução correta do wp-cli, portanto, não posso simplesmente desativar o plug-in com o wp-cli, executar minhas tarefas e reativá-lo.

Existe uma maneira de fazer algo como if x then do not load plugin file xdentro de um mu-plugin?

NextGenThemes
fonte

Respostas:

12

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_pluginsfiltro 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.phppelo 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-pluginsdiretó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.

Jacob Peattie
fonte
Teve a mesma idéia, mas isso não funciona. Pelo menos não no meu ambiente local. Talvez 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)
kero
Hum. Olhando a fonte e até onde eu sei, a única razão pela qual o option_filtro não seria aplicado é se ele não tiver um valor e retornar o padrão.
Jacob Peattie
Esse foi realmente o caso (nenhum plug-in ativo). Eu não deveria manter meus ambientes de teste muito limpo ..
kero
1
Eu aceitei isso porque no meu caso é o que eu precisava. Mesmo que, em geral, a --skip-plugin=xopção wp-cli possa ser a melhor maneira de fazer isso.
NextGenThemes
15

Você pode usar a skip-pluginsopção no WP-CLI para não carregar plug-ins individuais ao usar o WP-CLI.

Você pode usá-lo no comando como este:

wp user list --skip-plugins=my-plugin

Ou você pode adicionar isso ao seu wp-cli.ymlarquivo:

skip-plugins:
- my-plugin
swissspidy
fonte
-1

Apenas renomear o nome do diretório do plugin o desativará. Às vezes faço isso para desativar temporariamente um plugin [linux]:

mv my-plugin-dir renamed-my-plugin-dir
John Dee
fonte
O OP quiser pular o plugin apenas ao usar WP-CLI, não para qualquer outra atividade que poderia acontecer ao mesmo tempo
Mark Kaplun