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

10

Estou tentando tornar meu plug-in multisite compatível. Estou usando a função register_activation_hook() para registrar minha função my_activate() para ser executada quando o plug-in estiver 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 é que my_activate() não é executado para cada site quando meu plug-in é 'ativado pela rede'. Além disso, ele não é executado quando novos sites são criados na rede.

Como posso fazer com que minha rotina de ativação a) seja executada quando meu plug-in é ativado pela rede para todos os sites na rede e b) é executado quando um novo site é criado na rede multisite?

    
por henrywright 14.03.2015 / 01:21

1 resposta

17

Sua função de retorno de chamada deve ser executada quando seu plug-in for ativado pela rede ou ativado para um único site. De qualquer maneira, deveria 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, esteja ciente de que isso não ocorrerá imediatamente. O código em seu retorno de chamada será no blog principal contexto.

Se o seu código precisar ser executado em cada blog após a 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 querem funcionalidade semelhante, mas para todos os plug-ins ativados pela rede (não apenas o que você controla, se aplicável) , você pode querer olhar para: enlace que garantirá que cada plug-in em sua rede multisite na qual é ativado pela rede tenha seus register_activation_hook e register_deactivation_hook executado em cada contexto do blog.

    
por userabuser 14.03.2015 / 04:32