Come eseguire una funzione di attivazione quando il plugin è attivato in rete su più siti?


12

Sto cercando di rendere compatibile il mio plug-in multisito. Sto usando la register_activation_hook()funzione per registrare la mia my_activate()funzione da eseguire quando il plugin è attivato. Funziona bene su un'installazione su un unico sito.

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

Il problema è my_activate()che non funziona per ogni sito quando il mio plugin è "attivato in rete". Inoltre, non viene eseguito quando vengono creati nuovi siti sulla rete.

Come posso eseguire la mia routine di attivazione a ) eseguire quando il mio plugin è attivato in rete per tutti i siti della rete eb) eseguire quando viene creato un nuovo sito sulla rete multisito?

Risposte:


21

La funzione di richiamata dovrebbe essere eseguita quando il plug-in è attivato o attivato in rete per un singolo sito. Ad ogni modo, dovrebbe funzionare.

Tuttavia, se si intende eseguire il codice contenuto nel callback per ciascun blog nella propria rete, tenere presente che ciò non avverrà immediatamente, invece, il codice all'interno del callback verrà inserito nel contesto del blog principale.

Se il tuo codice deve essere eseguito su ciascun blog dopo l'attivazione della rete:

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

Se il tuo codice deve essere eseguito quando viene creato un nuovo 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 );

Inoltre:

Per coloro che desiderano funzionalità simili ma per tutti i plug-in che attivano la rete (non solo quello che controlli, se del caso) , ti consigliamo di consultare: https://wordpress.org/plugins/proper-network -Attivazione / che farà in modo che ogni plugin nella rete multisito in cui è attivato rete, ha sia la sua register_activation_hooke register_deactivation_hookgestito in ogni contesto blog.


grazie per la soluzione, molto apprezzata! Per quanto riguarda la tua prima frase, ho leggermente aggiornato il testo della mia domanda.
henrywright,

3
@henrywright register_activation_hookè solo un wrapper attorno al add_action('activate_' . $file, $function)quale si attiva di per sé, do_action( 'activate_' . $plugin, $network_wide )di cui puoi vedere la variabile $network_widee il suo stato di valore, uno di uno trueo falseviene sempre passato come argomento al callback. Quindi, hai accesso a questo argomento nel tuo register_activation_hooke register_deactivation_hookwrapper. Per ulteriori informazioni, consultare la activate_pluginfunzione all'interno wp-admin/includes/plugin.php. Spero possa aiutare.
Adam

1
Apprezzo la spiegazione e grazie ancora per la risposta :)
henrywright,

1
@ErenorPaz restore_current_blogdeve essere nel foreachciclo, perché se lo metti fuori, iterare (passare) ad esempio a 10 blog, l'ultima chiamata per restore_current_blogripristinare l'ultimo blog a cui sei passato e NON il blog originale da cui hai iniziato (presumibilmente il tuo sito principale). codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam

1
@ErenorPaz non è necessario eliminare il commento, poiché ciò rende la cronologia della chat confusa da leggere per le persone. Non c'è niente di sbagliato nel dare un'opinione anche se potrebbe non essere corretta. Nessuno ti odia per questo, siamo comunità qui per aiutare, discutere, imparare e ottenere prospettive. Comunque tutto bene ...
Adam
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.