Como executar uma função de ativação quando o plug-in está ativado na rede em vários sites?

12

Estou tentando tornar meu plug-in multisite compatível. Estou usando a register_activation_hook()função para registrar minha my_activate()função para executar quando o plug-in é ativado. Isso funciona bem em uma instalação de site único.

function my_activate() {
    // Do some things.
}
register_activation_hook( __FILE__, 'my_activate' );

O problema é my_activate()que não é executado para cada site quando meu plug-in é 'ativado por rede'. Além disso, ele não é executado quando novos sites são criados na rede.

Como posso obter minha rotina de ativação para: a) executar quando meu plug-in estiver ativado em rede para todos os sites da rede eb) executar quando um novo site for criado na rede multissite?

Henry Wright
fonte

Respostas:

21

Sua função de retorno de chamada deve ser executada quando o plug-in estiver ativado ou ativado em rede para um único site. De qualquer forma, deve estar funcionando.

No entanto, se você pretende que o código contido em seu retorno de chamada seja executado para cada blog em sua rede, lembre-se de que isso não acontecerá imediatamente, mas o código do retorno de chamada será no contexto principal do blog.

Se seu código precisar ser executado em cada blog na ativação de rede:

function my_plugin_activate($network_wide) {

    if ( is_multisite() && $network_wide ) { 

        global $wpdb;

        foreach ($wpdb->get_col("SELECT blog_id FROM $wpdb->blogs") as $blog_id) {
            switch_to_blog($blog_id);
            //do your specific thing here...
            restore_current_blog();
        } 

    } else {
        //run in single site context
    }

}

register_activation_hook( __FILE__, 'my_plugin_activate' );

Se seu código precisar ser executado quando um novo blog for criado:

function my_plugin_new_blog($blog_id, $user_id, $domain, $path, $site_id, $meta) {

    //replace with your base plugin path E.g. dirname/filename.php
    if ( is_plugin_active_for_network( 'my-plugin-name-dir/my-plugin-name.php' ) ) {
        switch_to_blog($blog_id);
        //do your specific thing here...
        restore_current_blog();
    } 

}

add_action('wpmu_new_blog', 'my_plugin_new_blog', 10, 6 );

Além disso:

Para aqueles que desejam funcionalidade semelhante, mas para todos os plug-ins que ativam a rede (não apenas aquele que você controla, se aplicável) , convém consultar: https://wordpress.org/plugins/proper-network -activation / que garantirá que cada plug-in na sua rede multissite na qual a rede está ativada tenha o seu register_activation_hooke seja register_deactivation_hookexecutado em cada contexto do blog.

Adão
fonte
obrigado pela solução, muito apreciado! Em relação à sua primeira frase, atualizei levemente a redação da minha pergunta.
henrywright
3
@henrywright register_activation_hooké apenas um invólucro em torno do add_action('activate_' . $file, $function)qual é acionado, do_action( 'activate_' . $plugin, $network_wide )do qual você pode ver a variável $network_widee seu estado de valor, um de um trueou falseé sempre passado como argumento para o retorno de chamada. Portanto, você tem acesso a esse argumento no seu register_activation_hooke register_deactivation_hookwrappers. Para mais informações, consulte a activate_pluginfunção wp-admin/includes/plugin.php. Espero que ajude.
Adam
1
Apreciar a explicação, e obrigado novamente pela sua resposta :)
henrywright
1
O @ErenorPaz restore_current_blogprecisa estar no foreachloop, porque se você o colocar fora, repita (alterne) para 10 blogs, por exemplo, a última chamada para restore_current_blogrestaurará o último blog para o qual você mudou e NÃO o blog original no qual você iniciou (presumivelmente seu site principal). codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam
1
O @ErenorPaz não precisa excluir o comentário, o que torna o histórico do bate-papo confuso para ler para as pessoas. Não há nada errado em dar uma opinião, mesmo que isso não esteja correto. Ninguém está odiando você por isso, somos uma comunidade aqui para ajudar, discutir, aprender e obter perspectiva. Enfim tudo de bom ...
Adam