Wie führe ich eine Aktivierungsfunktion aus, wenn das Plugin auf mehreren Sites netzwerkaktiviert ist?

12

Ich versuche mein Plugin multisite kompatibel zu machen. Ich benutze die register_activation_hook()Funktion, um meine Funktion zu registrieren my_activate(), damit sie ausgeführt wird, wenn das Plugin aktiviert ist. Dies funktioniert gut bei einer Installation an einem einzigen Standort.

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

Das Problem ist, my_activate()läuft nicht für jede Site, wenn mein Plugin 'Netzwerk aktiviert' ist. Außerdem wird es nicht ausgeführt, wenn neue Sites im Netzwerk erstellt werden.

Wie kann ich meine Aktivierungsroutine dazu bringen, a) ausgeführt zu werden, wenn mein Plugin für alle Sites im Netzwerk netzwerkaktiviert ist, und b) ausgeführt zu werden, wenn eine neue Site im Netzwerk mit mehreren Sites erstellt wird?

Henrywright
quelle

Antworten:

21

Ihre Rückruffunktion sollte ausgeführt werden, wenn Ihr Plugin im Netzwerk oder für eine einzelne Site aktiviert ist. In jedem Fall sollte es funktionieren.

Wenn Sie jedoch möchten, dass der in Ihrem Rückruf enthaltene Code für jedes Blog in Ihrem Netzwerk ausgeführt wird, müssen Sie sich darüber im Klaren sein, dass dies nicht automatisch geschieht, sondern der Code in Ihrem Rückruf im primären Blog-Kontext.

Wenn Ihr Code bei der Netzwerkaktivierung in jedem Blog ausgeführt werden muss:

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

Wenn Ihr Code beim Erstellen eines neuen Blogs ausgeführt werden muss:

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

Zusätzlich:

Für diejenigen, die ähnliche Funktionen wünschen, aber für alle Plugins, deren Netzwerk aktiviert wird (nicht nur für das Plugin, das Sie steuern, falls zutreffend) , können Sie sich folgende Informationen ansehen: https://wordpress.org/plugins/proper-network -Aktivierung / die sicherstellen, dass jedes Plugin in Ihrem Multi - Site - Netzwerk , in dem Netzwerk aktiviert ist , hat sowohl seine register_activation_hookund register_deactivation_hookin jedem Blog Kontext ausgeführt.

Adam
quelle
Vielen Dank für die Lösung, sehr geschätzt! In Bezug auf Ihren ersten Satz habe ich den Wortlaut meiner Frage leicht aktualisiert.
Henrywright
3
@henrywright register_activation_hookist nur ein Wrapper, auf add_action('activate_' . $file, $function)den selbst zugegriffen wird. Von diesem Wrapper do_action( 'activate_' . $plugin, $network_wide )können Sie die Variable $network_wideund ihren Wertezustand ablesen , entweder trueoder er falsewird immer als Argument an den Rückruf übergeben. Daher haben Sie Zugriff auf dieses Argument in Ihren register_activation_hookund register_deactivation_hookWrappern. Weitere Informationen finden Sie unter activate_pluginFunktion innerhalb wp-admin/includes/plugin.php. Ich hoffe, das hilft.
Adam
1
Schätzen Sie die Erklärung und nochmals
vielen
1
@ErenorPaz restore_current_blogmuss in der foreachSchleife sein, denn wenn Sie es nach draußen stellen, iterieren (umschalten) Sie beispielsweise auf 10 Blogs. Der letzte Aufruf stellt restore_current_blogdas letzte Blog wieder her, zu dem Sie gewechselt haben, und NICHT das ursprüngliche Blog, bei dem Sie begonnen haben (vermutlich) Ihre Hauptseite). codex.wordpress.org/WPMU_Functions/restore_current_blog
Adam
1
@ErenorPaz Der Kommentar muss nicht gelöscht werden. Dadurch wird der Chat-Verlauf für die Benutzer unübersichtlich. Es ist nichts Falsches, wenn man eine Meinung abgibt, auch wenn sie möglicherweise nicht richtig ist. Niemand hasst dich dafür, wir sind eine Gemeinschaft, die hilft, diskutiert, lernt und Perspektiven gewinnt. Wie auch immer, alles gut ...
Adam