Por que o activate_plugin não está funcionando no register_activation_hook

10

Estou tentando ativar o segundo plug-in automaticamente ao ativar o primeiro plug-in.

register_activation_hook(__FILE__, 'example_activation' );
function example_activation() {
        include_once(ABSPATH .'/wp-admin/includes/plugin.php');
        activate_plugin('hello.php');
}

Não está funcionando dentro register_activation_hook .. Está funcionando se eu usá-lo diretamente como:

include_once(ABSPATH .'/wp-admin/includes/plugin.php');
activate_plugin('hello.php');

Como posso corrigir isso? Obrigado pela ajuda

Solução:

Estou usando isso para mim agora:

// When this plugin activate, activate another plugin too.
register_activation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_inactive($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            /* for some reason, 
            activate_plugin($dependent); 
               is not working */
            activate_plugin('hello.php');
        });
    }
}); 

// When this plugin deactivate, deactivate another plugin too.
register_deactivation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_active($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            deactivate_plugins('hello.php');
        });
    }
}); 
    
por Ünsal Korkmaz 24.08.2012 / 18:47

2 respostas

8

Para uma explicação completa do que está acontecendo, veja este post (este é para desativar plug-ins, mas o problema é o mesmo).

Uma breve explicação: Os plug-ins são essencialmente ativados, adicionando-os à matriz de pug-ins ativos armazenados no banco de dados. Quando você ativa o primeiro plug-in, o WordPress recupera a matriz de todos os plug-ins atualmente ativos, adiciona o plug-in a ele (mas ainda não atualiza o banco de dados) e executa o retorno de chamada da instalação.

Este retorno de chamada da instalação executa seu código.

Depois disso, o WordPress atualiza o banco de dados com a matriz acima, que contém o primeiro mas não o segundo plug-in. Assim, seu segundo plug-in parece não estar ativado.

Solução: mencionou no link acima a solução é algo assim (não testado):

//This goes inside Plugin A.
//When A is activated. activate B.
register_activation_hook(__FILE__,'my_plugin_A_activate'); 
function my_plugin_A_activate(){
    $dependent = 'B/B.php';
    if( is_plugin_inactive($dependent) ){
         add_action('update_option_active_plugins', 'my_activate_dependent_B');
    }
}

function my_activate_dependent_B(){
    $dependent = 'B/B.php';
    activate_plugin($dependent);
}
    
por Stephen Harris 31.08.2012 / 23:33
2

Aqui está alguém explicando por que ele não estava funcionando para ele, e como ele teve que copiar o método activate_plugin e criar um personalizado sem o problema: enlace

Aqui está a fonte original do código activate_plugin, que você pode usar para criar sua própria função e ver onde ela não está funcionando: enlace

Aqui está uma solução possível, contendo um método alternativo de ativação de plugins que alguém provavelmente criou a partir desse código-fonte: Como ativar plugins via código?

    
por mltsy 24.08.2012 / 19:00