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

10

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 à site unique.

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 exécuter ma routine d'activation sur a) lorsque mon plug-in est activé sur le réseau pour tous les sites du réseau et que b) est exécuté lorsqu'un nouveau site est créé sur le réseau multisite?

    
posée henrywright 14.03.2015 - 01:21

1 réponse

17

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

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 blog principal. contexte.

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

De plus:

Pour ceux qui liront qui souhaitent une fonctionnalité similaire, mais pour tous les plug-ins activés par le réseau (pas uniquement celui que vous contrôlez, le cas échéant) , vous pouvez consulter: enlace qui garantit que chaque plug-in de votre réseau multisite sur lequel le réseau est activé a ses deux register_activation_hook et register_deactivation_hook exécuté dans chaque contexte de blog.

    
réponse donnée userabuser 14.03.2015 - 04:32

Lire d'autres questions sur les étiquettes