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.