Jak uruchomić funkcję aktywacji, gdy wtyczka jest aktywowana przez sieć na wielu stronach?

12

Próbuję uczynić moją wtyczkę kompatybilną z wieloma witrynami. Korzystam z tej register_activation_hook()funkcji, aby zarejestrować moją my_activate()funkcję do uruchomienia po aktywacji wtyczki. Działa to dobrze w przypadku instalacji w jednym miejscu.

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

Problem polega na tym, my_activate()że nie działa dla każdej witryny, gdy moja wtyczka jest „aktywowana przez sieć”. Ponadto nie działa, gdy w sieci tworzone są nowe witryny.

Jak mogę uruchomić moją procedurę aktywacji a) uruchomić, gdy moja wtyczka jest aktywowana w sieci dla wszystkich witryn w sieci i b) uruchomić, gdy nowa witryna zostanie utworzona w sieci obejmującej wiele witryn ?

henrywright
źródło

Odpowiedzi:

21

Funkcja oddzwaniania powinna działać, gdy wtyczka jest aktywowana w sieci lub aktywowana dla jednej witryny. Tak czy inaczej, powinno działać.

Jeśli jednak zamierzasz uruchamiać kod zawarty w wywołaniu zwrotnym dla każdego bloga w sieci, pamiętaj, że nie nastąpi to natychmiast po wyjęciu z pudełka, zamiast tego kod w wywołaniu zwrotnym będzie działał w podstawowym kontekście blogu.

Jeśli kod musi być uruchamiany na każdym blogu po aktywacji sieci:

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

Jeśli Twój kod musi zostać uruchomiony podczas tworzenia nowego bloga:

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

Do tego:

Dla osób czytających, które chcą podobnej funkcjonalności, ale dla wszystkich wtyczek aktywowanych przez sieć (nie tylko tych, które kontrolujesz, jeśli w ogóle mają zastosowanie) , możesz zajrzeć na: https://wordpress.org/plugins/proper-network -aktywacja / która zapewni, że każda wtyczka w sieci wielostanowiskowej, w której sieć jest aktywowana, ma swoją register_activation_hooki register_deactivation_hookdziała w każdym kontekście blogu.

Adam
źródło
dziękuję za rozwiązanie, bardzo mile widziane! Jeśli chodzi o twoje pierwsze zdanie, nieco zaktualizowałem brzmienie mojego pytania.
henrywright
3
@henrywright register_activation_hookjest tylko opakowaniem, wokół add_action('activate_' . $file, $function)którego samo odpala, do_action( 'activate_' . $plugin, $network_wide )na którym można zobaczyć zmienną $network_widei jej stan wartości, jeden z nich truelub falsezawsze przekazywany jako argument do wywołania zwrotnego. Dlatego masz dostęp do tego argumentu w swoim register_activation_hooki register_deactivation_hookopakowaniach. Aby uzyskać więcej informacji, zobacz activate_pluginfunkcję wewnątrz wp-admin/includes/plugin.php. Mam nadzieję, że to pomaga.
Adam
1
Doceń to wyjaśnienie i jeszcze raz dziękuję za odpowiedź :)
henrywright
1
@ErenorPaz restore_current_blogmusi być w foreachpętli, ponieważ jeśli umieścisz go na zewnątrz, a następnie iteruj (przełącz) na przykład na 10 blogów, ostatnie wezwanie do restore_current_blogprzywróci ostatniego bloga, na który się przełączyłeś, a NIE oryginalnego bloga, na którym zacząłeś (prawdopodobnie Twoja strona główna). codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam
1
@ErenorPaz nie trzeba usuwać komentarza, co powoduje, że historia czatów jest myląca z czytaniem dla innych. Nie ma nic złego w wyrażaniu opinii, nawet jeśli jest ona nieprawidłowa. Nikt cię nie nienawidzi za to, jesteśmy tutaj, aby pomagać, dyskutować, uczyć się i zdobywać perspektywę. W każdym razie wszystko dobrze ...
Adam