Como ativar plugins via código?

22

Se possível, como os plug-ins instalados (ou seja, os arquivos foram colocados no diretório wp-content / plugins) podem ser ativados a partir de outros plug-ins?

rsman
fonte

Respostas:

30

Foi assim que fiz em alguns aplicativos da web:

function run_activate_plugin( $plugin ) {
    $current = get_option( 'active_plugins' );
    $plugin = plugin_basename( trim( $plugin ) );

    if ( !in_array( $plugin, $current ) ) {
        $current[] = $plugin;
        sort( $current );
        do_action( 'activate_plugin', trim( $plugin ) );
        update_option( 'active_plugins', $current );
        do_action( 'activate_' . trim( $plugin ) );
        do_action( 'activated_plugin', trim( $plugin) );
    }

    return null;
}
run_activate_plugin( 'akismet/akismet.php' );
sorich87
fonte
1
Como Rarst escreveu, isso não é muito "seguro". Você deve se certificar de que os plug-ins que você ativar desta forma sejam seguros / não quebrem o seu site.
sorich87
10
Nem um pouco seguro, mas, diabos, se você os estiver ativando programaticamente, você deve saber o que está fazendo. ;-)
Denis de Bernardy 14/11
Segurança à parte - quero dizer, isso não faz parte da questão, certo? - Gosto da abordagem de Sorich porque chama os filtros de ativação padrão. Portanto, os plug-ins recebem uma alteração para executar suas rotinas de instalação, se houver algum.
hakre
3
Isso, pelo menos mais recentemente, está reinventando a roda. Eu usei o built-in activate_plugin(), e parece funcionar da mesma forma.
Jake
1
@SagiveSEO É perfeitamente seguro - é semelhante ao modo como o WP o faz, exceto exigindo a entrada / aprovação do usuário e forma nonces e verificações para esses nonces - basta introduzir as verificações necessárias para iniciar essa função em qualquer lugar - para que não possa ser acessado de fora (de web etc) e não pode ser chamado aleatoriamente de forma alguma.
unity100
13

O processo de ativação do plug-in é codificado para funcionar com a interface administrativa do WP. Ele realiza algumas verificações para impedir a ativação de plugins com erros (o carregamento no início pode interromper o WP).

É tratado pela activate_plugin()função ( origem ) que está documentada como inutilizável em outro lugar.

Portanto, se você deseja ativar o plug-in por código, o objetivo em si é relativamente fácil - alterar a active_pluginsopção para incluir esse plug-in. Mas você terá que recriar ganchos de ativação relacionados a partir do zero e corre o risco de quebrar o site ativando sem a etapa de sandbox.

Rarst
fonte
7

Os plugins são armazenados em uma matriz na opção 'active_plugins'. A matriz contém o caminho do arquivo para cada plug-in ativo.

Para ativar um plug-in, você precisa determinar qual será o caminho e depois passá-lo para activate_plugin($plugin_path).

Isso é mais fácil dizer do que fazer, e (pelo menos na versão 2.9) o código principal não facilita.

Antes de poder ativar o plugin_, você precisa incluir o arquivo plugin.php em wp-admin / includes /. Você também deve verificar se o seu plug-in ainda não está ativo. O resultado é algo como isto (YMMV):

// Define the new plugin you want to activate
$plugin_path = '/path/to/your/new/plugin.php';
// Get already-active plugins   
$active_plugins = get_option('active_plugins');
// Make sure your plugin isn't active
if (isset($active_plugins[$plugin_path]))
    return;

// Include the plugin.php file so you have access to the activate_plugin() function
require_once(ABSPATH .'/wp-admin/includes/plugin.php');
// Activate your plugin
activate_plugin($plugin_path);

Eu uso isso na produção no WP 2.9 e não tive grandes problemas, mas em meus testes ele teve resultados muito inesperados com a WPMU, portanto, tenha cuidado ao usá-lo nas instalações de rede.

jerclarke
fonte
passou muito tempo, mas se você se lembra, qual foi o resultado inesperado nisso?
Ünsal Korkmaz
Eu não me lembro completamente. Acho que não funcionou e fiz as coisas manualmente porque não tinha muitos sites de MS.
precisa saber é o seguinte
como faço para executar isso? se eu executá-lo diretamente, get_Option não está definida ...
Janus Troelsen
Adicione isso em functions.php e ele deve funcionar, embora mesmo assim você sempre deva colocar as coisas em funções e conectá-las a "init" ou "wp".
precisa saber é
3

O Wordpress fornece uma função para ativar plugins, de acordo com o WP Codex

function plugin_activation( $plugin ) {
    if( ! function_exists('activate_plugin') ) {
        require_once ABSPATH . 'wp-admin/includes/plugin.php';
    }

    if( ! is_plugin_active( $plugin ) ) {
        activate_plugin( $plugin );
    }
}

plugin_activation('akismet/akismet.php');
Mowshon
fonte
Ethan, o que há de errado com a minha resposta?
Mowshon 28/10
Embora postar apenas o código seja aceitável para uma resposta, pode ser difícil de interpretar para qualquer novo programador que leia sua resposta. Dessa forma, o OP pode entender melhor como o seu código funciona.
Ethan Jinks O'Sullivan 28/10
0

Você pode simplesmente chamar a função padrão do WordPress.

activate_plugin('akismet/akismet.php');

Por favor, verifique o link abaixo para obter mais detalhes.

ativar plugin

Sohel Khan
fonte