web-dev-qa-db-fra.com

Comment exécuter une fonction d'activation lorsque le plug-in est activé sur un réseau multisite?

J'essaie de rendre mon plugin multisite compatible. J'utilise la fonction register_activation_hook() pour enregistrer ma fonction my_activate() à exécuter lorsque le plug-in est activé. Cela fonctionne bien sur une installation mono-site.

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

Le problème est que my_activate() ne s'exécute pas pour chaque site lorsque mon plug-in est "activé par le réseau". En outre, il ne s'exécute pas lorsque de nouveaux sites sont créés sur le réseau.

Comment puis-je obtenir ma routine d'activation sur a) run lorsque mon plug-in est activé sur le réseau pour tous les sites du réseau et b) / lorsqu'un nouveau site est créé sur le réseau multisite?

10
henrywright

Votre fonction de rappel devrait s'exécuter lorsque votre plug-in est activé sur le réseau ou activé pour un seul site. De toute façon, ça devrait marcher.

Toutefois, si vous souhaitez que le code contenu dans votre rappel soit exécuté pour chaque blog de votre réseau, sachez que cela ne se produira pas immédiatement, mais que le code dans votre rappel sera dans le contexte du blog principal.

Si votre code doit être exécuté sur chaque blog lors de l'activation du réseau:

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 votre code doit être exécuté lors de la création d'un nouveau 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 );

Aditionellement:

Pour ceux qui lisent qui veulent une fonctionnalité similaire, mais pour tous les plugins dont le réseau est activé (pas uniquement celui que vous contrôlez, le cas échéant) , alors vous pouvez consulter: https: // wordpress .org/plugins/proper-network-activation/ qui garantira que chaque plugin de votre réseau multisite sur lequel le réseau est activé, a ses register_activation_hook et register_deactivation_hook exécutés dans chaque contexte de blog.

19
userabuser