¿Cómo ejecutar una función de activación cuando el complemento se activa en red en varios sitios?

12

Estoy tratando de hacer que mi complemento sea compatible con múltiples sitios. Estoy usando la register_activation_hook()función para registrar mi my_activate()función para que se ejecute cuando se active el complemento. Esto funciona bien en una instalación de un solo sitio.

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

El problema es my_activate()que no se ejecuta para cada sitio cuando mi complemento está 'activado por la red'. Además, no se ejecuta cuando se crean nuevos sitios en la red.

¿Cómo puedo hacer que mi rutina de activación se ejecute a ) cuando mi plugin esté activado por la red para todos los sitios de la red yb) cuando se cree un nuevo sitio en la red multisitio?

henrywright
fuente

Respuestas:

21

Su función de devolución de llamada debe ejecutarse cuando su complemento está activado en la red o activado para un solo sitio. De cualquier manera, debería estar funcionando.

Sin embargo, si tiene la intención de que el código contenido dentro de su devolución de llamada se ejecute para cada blog en su red, tenga en cuenta que esto no sucederá de manera inmediata, sino que el código dentro de su devolución de llamada lo hará en el contexto primario del blog.

Si su código necesita ejecutarse en cada blog luego de la activación de la red:

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' );

Si su código necesita ejecutarse cuando se crea un nuevo blog:

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 );

Adicionalmente:

Para aquellos lectores que desean una funcionalidad similar pero para todos los complementos que activan la red (no solo el que usted controla, si corresponde) , puede consultar: https://wordpress.org/plugins/proper-network -activation / que asegurará que cada complemento en su red multisitio en el que está activada la red, tenga ambos register_activation_hooky se register_deactivation_hookejecute en cada contexto de blog.

Adán
fuente
gracias por la solución, muy apreciada! Con respecto a su primera oración, he actualizado ligeramente la redacción de mi pregunta.
henrywright
3
@henrywright register_activation_hookes sólo una envoltura alrededor de add_action('activate_' . $file, $function)la cual en sí misma dispara contra, do_action( 'activate_' . $plugin, $network_wide )de los cuales se puede ver la variable $network_widey el valor de su estado, ya sea uno de trueo falsesiempre se pasa como argumento a la devolución de llamada. Por lo tanto, tiene acceso a este argumento en su register_activation_hooky register_deactivation_hookcontenedores. Para más información vea la activate_pluginfunción dentro wp-admin/includes/plugin.php. Espero que ayude.
Adam
1
Agradezco la explicación, y gracias de nuevo por su respuesta :)
henrywright
1
@ErenorPaz restore_current_blognecesita estar en el foreachciclo, porque si lo coloca afuera, luego itere (cambie) a 10 blogs, por ejemplo, la última llamada a restore_current_blogrestaurará el último blog al que cambió y NO el blog original en el que comenzó (presumiblemente su sitio principal) codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam
1
@ErenorPaz no necesita eliminar el comentario, ya que esto hace que el historial de chat sea confuso de leer para las personas. No hay nada malo en dar una opinión, incluso si puede no ser correcta. Nadie te odia por eso, somos una comunidad aquí para ayudar, discutir, aprender y ganar perspectiva. De todos modos todo bien ...
Adam