Zum Inhalt springen

Ein WordPress Plugin Multisite kompatibel machen

Ein WordPress Plugin Multisite kompatibel machen

In letzter Zeit wurde ich mehrfach gefragt ob mein WordPress Plugin (Easy Code Placement) Multisite / Netzwerk fähig ist. Da dies bisher nicht der Fall war, hatte ich mich schlau gemacht was hierfür nötig ist. Eigentlich ist dies relativ einfach umzusetzen. Jedoch sind die Informationen die ich gefunden habe sehr undurchsichtig, nicht vollständig und meistens auf Englisch. Letzteres ist für mich kein Problem. Aber um anderen das ganze einfacher zu gestalten, folgt nun meine Anleitung hierzu.

Wie funktioniert ein WordPress Multisite Netzwerk?

Multisite wurde mit der WordPress Version 3.0 eingeführt. Diese Funktion gibt einem die Möglichkeit, verschiedene WordPress Webseiten mit einer einzigen WordPress Installation zu erstellen. Wenn ein Multisite Netzwerk erstellt wird, werden verschiedene Tabellen in der Datenbank angelegt die von allen Webseiten genutzt werden. Zusätzlich bekommt jede Webseite ein paar eigene Tabellen in der Datenbank in denen zum Beispiel die Beiträge und Kommentare gespeichert werden. Diese Tabellen werden unter einer nur einmal vorkommenden blog_id gespeichert die aus Zahlen besteht. Die Standard WordPress Installation nutzt „wp_“. Eine zweite Multisite Installation zum Beispiel „wp2_“. Mehr Informationen zur WordPress Datenbank gibt es unter https://codex.wordpress.org/Database_Description (Englisch).

datenbankstruktur mysql tabellen

Was muss beachtet beziehungsweise am Plugin angepasst werden?

  • Bei der Installation des Plugins braucht jede Webseite die neuen Tabellen des Plugins
  • Bei dem hinzufügen einer Webseite müssen die Tabellen für das Plugin angelegt werden
  • Bei dem löschen einer Webseite müssen die Tabellen des Plugins gelöscht werden
  • Bei der Deinstallation des Plugins müssen von allen Webseite die Tabellen gelöscht werden werden

Die Installation des Plugins

Normalerweise sieht es wie folgt aus, wenn wir der Datenbank während der Installation des Plugins Tabellen hinzufügen möchten. Bitte beachten: Die database() Funktion wird bei den weiteren Funktionen verwendet und nicht verändert!

function database() {
    global $wpdb;
    //Tabelle die in die Datenbank eingefügt wird
    $table = "CREATE TABLE IF NOT EXISTS ".$wpdb->prefix."options (
        `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `option_name` varchar(10) COLLATE utf8_unicode_ci NOT NULL UNIQUE,
        `option_value` varchar(10) COLLATE utf8_unicode_ci NOT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1";
    $wpdb->query($table);
}

// Hook der WordPress mitteilt das etwas bei der Installation des Plugins zu tun ist
register_activation_hook ( __FILE__, 'database' );

Damit alles auch bei einer Multisite / Netzwerk Installation korrekt funktioniert, müssen wir dies nun anpassen. Den „register_activation_hook“ ändern wir etwas und wir fügen eine neue Funktion hinzu.

function plugin_install($networkwide) {
    global $wpdb;  
    // Prüfen ob es sich um eine Multisite / Netzwerk Installation handelt
    if (is_multisite() && $networkwide) {
        // Multisite / Netzwerk Plugin Installation
        $blog = $wpdb->blogid;
        $blogids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs");
        // Jeder Webseite die Tabellen in der Datenbank einfügen
        foreach ($blogids as $blogid) {
            switch_to_blog($blogid);
            database();
        }
	switch_to_blog($blog);
    // Normale Plugin Installation
    } else {
    database();
    }
}

// Hook der WordPress mitteilt das etwas bei der Installation des Plugins zu tun ist
register_activation_hook ( __FILE__, 'plugin_install' );

Wenn eine Webseite hinzugefügt wird

Um einer neuen Webseite die benötigten Tabellen hinzuzufügen, brauchen wir folgendes. Bitte beachten: Der Teil „plugin-ordner-name/plugin-haupt-datei.php“ muss mit euren Plugin Daten angepasst werden!

function new_blog($blog_id) {
    if ( is_plugin_active_for_network( 'plugin-ordner-name/plugin-haupt-datei.php' ) ) {
        switch_to_blog($blog_id);
        // Neuer Webseite die Tabelle in der Datenbank einfügen
        database();
        restore_current_blog();
    }
}

// Hook der WordPress mitteilt das etwas beim hinzufügen einer neuen Webseite zu tun ist
add_action ( 'wpmu_new_blog', 'new_blog', 99 );

Wenn eine Webseite gelöscht wird

Um beim löschen einer Webseite die Tabellen von uns aus der Datenbank zu entfernen, müssen wir folgendes hinzufügen.

function deleted_blog($tables) {
    global $wpdb;
    // Tabellen die gelöscht werden sollen
    $tables[] = $wpdb->prefix.'options';
    return $tables;
}

// Hook der WordPress mitteilt das Tabellen beim löschen einer Webseite zu entfernen sind
add_filter ( 'wpmu_drop_tables', 'deleted_blog', 99 );

Die Deinstallation des Plugins

Normalerweise sieht es wie folgt aus, wenn wir während der Deinstallation des Plugins Tabellen löschen möchten. Bitte beachten: Die uninstall() Funktion wird bei der nächsten Funktion verwendet und nicht verändert!

function uninstall() {
    global $wpdb;
    //Tabelle aus der Datenbank löschen
    $wpdb->query("DROP TABLE ".$wpdb->prefix."options");
}

// Hook der WordPress mitteilt das etwas bei der Deinstallation des Plugins zu tun ist
register_uninstall_hook ( __FILE__, 'uninstall' );

Damit alles auch bei einer Multisite / Netzwerk Deinstallation korrekt funktioniert, müssen wir dies nun anpassen. Den “register_uninstall_hook” ändern wir etwas und wir fügen eine neue Funktion hinzu.

function plugin_uninstall($networkwide) {
    global $wpdb;  
    // Prüfen ob es sich um eine Multisite / Netzwerk Deinstallation handelt
    if (is_multisite() && $networkwide) {
        // Multisite / Netzwerk Plugin deinstallation
        $blog = $wpdb->blogid;
        $blogids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs");
        // Von jeder Webseite die Tabellen in der Datenbank löschen
        foreach ($blogids as $blogid) {
            switch_to_blog($blogid);
            uninstall();
        }
	switch_to_blog($blog);
        
    // Normale Plugin deinstallation
    } else {
    uninstall();
    }
}

// Hook der WordPress mitteilt das etwas bei der Deinstallation des Plugins zu tun ist
register_uninstall_hook ( __FILE__, 'plugin_uninstall' );

2 Gedanken zu „Ein WordPress Plugin Multisite kompatibel machen“

  1. Pingback: Meine WordPress Plugins 2019 – Randnotizen.org

  2. Pingback: Meine WordPress Plugins 2016 – Randnotizen.org

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert