Comment exécuter une fonction d'activation lorsque le plugin est activé en réseau sur multisite?

12

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

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

Le problème est, my_activate()ne fonctionne pas pour chaque site lorsque mon plugin 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 pour a) s'exécuter lorsque mon plugin est activé par le réseau pour tous les sites du réseau et b) s'exécuter lorsqu'un nouveau site est créé sur le réseau multisite?

Henrywright
la source

Réponses:

21

Votre fonction de rappel devrait fonctionner lorsque votre plugin est activé par le réseau ou activé pour un seul site. Quoi qu'il en soit, cela devrait fonctionner.

Cependant, si vous avez l'intention d'exécuter le code contenu dans votre rappel pour chaque blog de votre réseau, sachez que cela ne se produira pas immédiatement, 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 des fonctionnalités similaires mais pour tous les plugins qui sont activés sur le réseau (pas seulement celui que vous contrôlez, le cas échéant) , vous pouvez consulter: https://wordpress.org/plugins/proper-network -activation / qui garantira que chaque plugin de votre réseau multisite dans lequel est activé le réseau, a son register_activation_hooket register_deactivation_hooks'exécute dans chaque contexte de blog.

Adam
la source
merci pour la solution, très appréciée! Concernant votre première phrase, j'ai légèrement mis à jour le libellé de ma question.
henrywright
3
@henrywright register_activation_hookest juste un wrapper autour add_action('activate_' . $file, $function)duquel se déclenche lui-même, do_action( 'activate_' . $plugin, $network_wide )dont vous pouvez voir la variable $network_wideet son état de valeur, l'un trueou l' autre ou falseest toujours passé comme argument au rappel. Par conséquent, vous avez accès à cet argument dans vos wrappers register_activation_hooket register_deactivation_hook. Pour plus d'informations, voir la activate_pluginfonction dans wp-admin/includes/plugin.php. J'espère que cela pourra aider.
Adam
1
Appréciez l'explication, et merci encore pour votre réponse :)
henrywright
1
@ErenorPaz restore_current_blogdoit être dans la foreachboucle, car si vous le mettez à l'extérieur, puis itérez (basculez) sur 10 blogs par exemple, le dernier appel à restore_current_blogrestaurera le dernier blog vers lequel vous êtes passé et PAS le blog d'origine où vous avez commencé (vraisemblablement votre site principal). codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam
1
@ErenorPaz n'a pas besoin de supprimer le commentaire, ce qui rend l'historique de discussion difficile à lire pour les gens. Il n'y a rien de mal à donner une opinion même si elle n'est peut-être pas correcte. Personne ne vous hait pour cela, nous sommes une communauté ici pour aider, discuter, apprendre et gagner en perspective. Quoi qu'il en soit tout va bien ...
Adam