Eklenti çoklu sitede ağ etkinleştirildiğinde bir etkinleştirme işlevi nasıl çalıştırılır?


12

Eklentimi multisite uyumlu hale getirmeye çalışıyorum. Eklenti etkinleştirildiğinde çalıştırmak için register_activation_hook()işlevimi kaydetmek için işlevi kullanıyorum my_activate(). Bu, tek site yüklemesinde iyi çalışır.

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

Sorun, my_activate()eklentim 'ağ etkin' olduğunda her site için çalışmaz. Ayrıca, ağda yeni siteler oluşturulduğunda çalışmaz.

Etkinleştirme rutinimi a) eklentim ağdaki tüm siteler için ağ etkinleştirildiğinde ve b) çoklu site ağında yeni bir site oluşturulduğunda nasıl çalıştırabilirim?

Yanıtlar:


21

Sizin geri çağırma işlevi olmalıdır Eklenti ağ aktive veya tek site için aktive olduğunda çalıştırın. Her iki durumda da, çalışıyor olmalı.

Ancak, geri aramalarınızda yer alan kodun ağınızdaki her blog için çalıştırılmasını istiyorsanız, bunun kutudan çıkmayacağını unutmayın, bunun yerine geri aramalarınızdaki kod birincil blog bağlamında olacaktır.

Ağ Etkinleştirmesi üzerine kodunuzun her blogda çalışması gerekiyorsa:

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

Yeni bir blog oluşturulduğunda kodunuzun çalışması gerekiyorsa:

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

Bunlara ek olarak:

Benzer işlevsellik isteyen ancak ağın etkinleştirildiği tüm eklentiler için (yalnızca geçerliyse, kontrol edebildiğiniz değil ) , şunlara bakmak isteyebilirsiniz: https://wordpress.org/plugins/proper-network -activation / senin çoklu ağındaki her eklenti hangi ağ aktive olmasını sağlayacaktır hangi sahiptir hem onun register_activation_hookve register_deactivation_hookher blog bağlamında çalışır.


çözüm için teşekkürler, çok takdir! İlk cümlenize gelince, sorumun ifadesini biraz güncelledim.
henrywright

3
@henrywright register_activation_hooksadece add_action('activate_' . $file, $function)kendi etrafında ateşlenen do_action( 'activate_' . $plugin, $network_wide ), değişkenini $network_wideve değer durumunu görebileceğiniz ya trueda falseher zaman geri çağrıya argüman olarak iletilen bir sarıcıdır . Bu nedenle, bu argümana sizin register_activation_hookve register_deactivation_hooksarmalayıcılarınızdan erişebilirsiniz . Daha fazla bilgi için bkz activate_pluginfonksiyonu içinde wp-admin/includes/plugin.php. Umarım yardımcı olur.
Adam

1
Açıklamayı takdir
ediyorum

1
@ErenorPaz'ın döngüde restore_current_blogolması gerekir foreach, çünkü dışarı koyarsanız, örneğin 10 blog'u yineleyin (geçiş yapın), son aradığınız restore_current_blogson blog'u geri yükler ve başladığınız orijinal blogu DEĞİL (muhtemelen ana siteniz). codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam

1
@ErenorPaz yorumu silmeye gerek yok, bunu yapmak sohbet geçmişini insanlar için okumak için kafa karıştırıcı hale getirir. Doğru olmasa bile bir görüş bildirmek yanlış bir şey değildir. Bunun için kimse senden nefret etmiyor, burada yardım etmek, tartışmak, öğrenmek ve perspektif kazanmak için topluluğuz. Her neyse iyi ...
Adam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.