Bagaimana menjalankan fungsi aktivasi ketika plugin diaktifkan jaringan di multisite?

12

Saya mencoba membuat plugin saya multisite kompatibel. Saya menggunakan register_activation_hook()fungsi untuk mendaftarkan my_activate()fungsi saya untuk dijalankan ketika plugin diaktifkan. Ini bekerja dengan baik pada instalasi satu situs.

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

Masalahnya adalah, my_activate()tidak berjalan untuk setiap situs ketika plugin saya 'jaringan diaktifkan'. Juga, itu tidak berjalan ketika situs baru dibuat di jaringan.

Bagaimana saya dapat mengaktifkan rutin aktivasi saya untuk ) berjalan ketika plugin saya diaktifkan jaringan untuk semua situs dalam jaringan dan b) berjalan ketika situs baru dibuat pada jaringan multisite?

Henryrywright
sumber

Jawaban:

21

Fungsi panggilan balik Anda harus dijalankan ketika plugin Anda diaktifkan atau diaktifkan untuk satu situs. Either way, itu harusnya berfungsi.

Namun, jika Anda bermaksud agar kode yang terkandung dalam panggilan balik Anda dijalankan untuk setiap blog di jaringan Anda, maka ketahuilah bahwa ini tidak akan terjadi di luar kotak, sebaliknya, kode dalam panggilan balik Anda akan berada dalam konteks blog utama.

Jika kode Anda perlu dijalankan di setiap blog setelah Aktivasi Jaringan:

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

Jika kode Anda perlu dijalankan saat blog baru dibuat:

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

Selain itu:

Bagi mereka yang ingin fungsi serupa tetapi untuk semua plugin yang mengaktifkan jaringan (bukan hanya yang Anda kendalikan, jika berlaku) , maka Anda mungkin ingin melihat: https://wordpress.org/plugins/proper-network -aktivasi / yang akan memastikan bahwa setiap plugin di jaringan multisite Anda di mana jaringan diaktifkan, memiliki keduanya register_activation_hookdan register_deactivation_hookberjalan di setiap konteks blog.

Adam
sumber
terima kasih untuk solusinya, sangat dihargai! Mengenai kalimat pertama Anda, saya sedikit memperbarui pertanyaan saya.
henrywright
3
@henrywright register_activation_hookhanyalah pembungkus di add_action('activate_' . $file, $function)mana dengan sendirinya menyala, do_action( 'activate_' . $plugin, $network_wide )di mana Anda dapat melihat variabel $network_widedan status nilainya, salah satu dari keduanya trueatau falseselalu dilewatkan sebagai argumen ke callback. Karenanya, Anda memiliki akses ke argumen ini di pembungkus Anda register_activation_hookdan register_deactivation_hook. Untuk informasi lebih lanjut lihat activate_pluginfungsi di dalamnya wp-admin/includes/plugin.php. Semoga itu bisa membantu.
Adam
1
Hargai penjelasannya, dan terima kasih sekali lagi atas jawaban Anda :)
henrywright
1
@ErenorPaz restore_current_blogperlu di foreachloop, karena jika Anda meletakkannya di luar, maka iterate (beralih) ke 10 blog misalnya, panggilan terakhir untuk restore_current_blogakan mengembalikan blog terakhir Anda beralih dan TIDAK blog asli Anda mulai (mungkin situs utama Anda). codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam
1
@ErenorPaz tidak perlu menghapus komentar, hal itu membuat riwayat obrolan membingungkan untuk dibaca orang. Tidak ada yang salah memberikan pendapat meskipun itu mungkin tidak benar. Tidak ada yang membenci Anda karena itu, kami adalah komunitas di sini untuk membantu, berdiskusi, belajar, dan mendapatkan perspektif. Pokoknya semua baik ...
Adam