Best Practice WordPress: Multisite

Diversifikation - mit Multissite richtig lecker.
Diversifikation – mit Multissite richtig lecker.

Wie funktioniert ein WordPress Multisite Netzwerk?

Multisite kam mit WordPress 3.0. Diese Funktion eröffnet die Möglichkeit, verschiedene WordPress Instanzen subdomain-, domain- oder folderbasiert aus einer einzigen WordPress Installation zu speisen.

Plugins

Auf der Plugin-Seite der Netzverwaltung kann festgelegt werden, dass ein Plugin auf allen Seiten aktiviert sein muss. Nur der  Netzwerk-Administrator kann das festlegen, die Site-Administratoren haben dort dann keine Änderungsmöglichkeit.

Plugins in der Ansicht Netzwerkverwaltung

Themes

Es stehen nicht immer alle installierten Themes im ganzen Netzwerk zur Verfügung.  Nur die, bei die bei denen „Netzwerkweit freischalten“ aktiviert wurde, sind im gesamten Netzwerk auswählbar.

Themes in der Ansicht Netzwerkverwaltung

In der Theme-Verwaltung kann man sehen, welche Themes wie freigeschaltet wurden. Nur der Super-Administrator kann Themes verändern oder neu hinzufügen.  Netzwerk freigegebene Themes sind in allen Netz-Websites verfügbar.

User

Die Instanzen sind semantisch komplett getrennt, können also auch von völlig unterschiedlichen Redakteuren, Developern und Admins bearbeitet werden. Das Konzept sieht einen Superadmin vor, der alles steuern kann.

Datenbank

Multisite Netzwerk Tabellen

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, die ein eigenes Prefix erhalten. 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 gibt es unter https://codex.wordpress.org/Database_Description (Englisch).

Plugin-Entwicklung/Anpassung:

Verschiedene Tabellen unterschiedlicher Multisite-Instanzen.

Viele hochwertige Plugins sind bereits Multisitefähig, dies gilt aber keineswegs für alle Plugins. Genauso muss man bei der Entwicklung eigener Multisite Plugins darauf achten, dass diese eben multisitefähig gecoded werden.

Anwendungsmöglichkeiten WordPress-Multisite

Auch wenn Plugins / Themes / User etc. multisitefähig sein können, s.U., sollte man im Hinterkopf behalten, dass Multisite vor allem dann interessant ist, wenn Sites weitgehend ähnliche Funktionen und Themes nutzen. Das beste Beispiel ist wordpress.org selbst, dies dürfte das größte WordPress Netzwerk weltweit-web-weit sein.

Echte Mehrsprachigkeit

Eine gute Möglichkeit des Einsatzes ist auch echte Mehrsprachigkeit. Echte Mehrsprachigkeit berücksichtigt nicht einfach nur „das Übersetzen“ der Inhalte, sondern bereitet diese auch kulturtypisch auf. Will man etwas in Frankreich verkaufen, sollte man nicht nur die Site übersetzen, sonden den Content in eine Form bringen, die speziell für den französischen Markt aufbereitet ist. Auch einzelne Funktionalitäten können vielleicht in der deutschen Instanz vorkommen, nicht aber in der Französischen etc.pp..

Unterschiedliche Divisions mit unterschiedlicher Contentverantwortung

Vielleicht hat ihr Unternehmen unterschiedliche Divisions, die aus Marketinggründen unterschiedliche Darstellungsformen im Web brauchen. Dann ist Multisite äußerst interessant, da die gesamte Theming- und Contentredaktion unterschiedlich sein kann. Auch Rollen wie Redakteur, Autor, Abonnent, Administrator etc. können voneinander unabhängig in einer eigenen Instanz „agieren“. Der Superadmin behält dennoch den Überblick, was das gesamte WordPress Multisite Netzwerk angeht.

Website als Dienstleistung für Mitglieder einer Einrichtung

Universitäten bieten häufig Websites für die Studierenden, mit Multisite kann man aus einer WordPress Instanz jedes Mitglied einer Institution mit einem persönlichen kleinen Webauftritt versorgen.

Intranet und Internet

Haben Sie vielleicht einen internen Bereich für Ihre Mitglieder oder Angestellten, und gleichzeitig eine Website für die Öffentlichkeit – zusätzlich vielleicht Infoscreens in der Kantine, in einem Shop oder sonstwo – all dies können Sie aus einer Instanz bespielen und dafür sorgen, dass Content, Design und Funktionalität eine jeweils eigene Ausprägung haben.

Passen Sie aber auf, dass ihr WordPress Dschungel begehbar bleibt, die Pflänzchen sollten nicht allzu wild wuchern 😉

Codebeispiel Installationshook eines multisitefähigen Plugins

Der Datenbank werden während der Installation eines Plugins Tabellen hinzugefügt.

function database_install() {
    global $wpdb;
    $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);
}
 
register_activation_hook ( __FILE__, 'database_install' );

Damit alles auch bei einer Multisite / Netzwerk De/Installation korrekt funktioniert, muss diese Basis Hook Funktion multisitefähig gecoded werden:

function plugin_install_multisite($networkwide) 
{
    global $wpdb;  
    // Prüfen: Ist es eine Multisite / Netzwerk Installation?
    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_install();
    }
}
register_activation_hook ( __FILE__, 'plugin_install_multisite' );

Deinstallation
Damit alles auch bei einer Multisite / Netzwerk Deinstallation korrekt funktioniert, müssen wir auch hier auf die erweiterte Funktionalität achten.

function plugin_uninstall($networkwide) {
    global $wpdb;  
    if (is_multisite() && $networkwide) {

        $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();
    }
}
 
register_uninstall_hook ( __FILE__, 'plugin_uninstall' );

Natürlich muss auch im weiteren Verlauf beachtet werden, dass, soweit Schreib/Lesezugriffe auf die Datenbank erfolgen, die richtigen Tabellen gewählt werden.
Mit

"$blog = $wpdb->blogid;"

kann man sich prinzipiell immer die ID des jeweiligen Blogs holen und sich so den richtigen Prefix zusammen basteln.