WordPress Multitenancy – Mandantentauglichkeit

Auf meinen Servern gibt es einige WordPress Blogs. Viele davon liegen in einem Multisite-Environment. Das ist zwar schön und gut, trotzdem nervt es hin und wieder. Gerade dann wenn der User von Blog „FooBar“ gerne ein Plugin installiert haben möchte. Denn: Das geht nur als Network-Admin und dann auch nur für alle Blogs… Super nervig. Noch nerviger ist es einen Blog in dieses Environment hinein zu schieben oder sogar mal heraus. Das liegt hauptsächlich daran, dass alles in einer Datenbank liegt. Richtig: Auch nervig! Abhilfe wäre, jedem seine eigene WordPress Instanz zu schenken. Nachteil: Für jeden Blog bräuchte man die Core-Files…. Lösung: Multitenancy.

Was ist Multitenancy?

Zu deutsch etwa „Mandantentauglichkeit“. Ich zitiere ganz frech einmal Wikipedia:

Als mandantenfähig (auch mandantentauglich) wird Informationstechnik bezeichnet, die auf demselben Server oder demselben Software-System mehrere Mandanten, also Kunden oder Auftraggeber, bedienen kann, ohne dass diese gegenseitigen Einblick in ihre Daten, Benutzerverwaltung und Ähnliches haben. Ein IT-System, das dieser Eigenschaft genügt, bietet die Möglichkeit der disjunkten, mandantenorientierten Datenhaltung, Präsentation (GUI) und Konfiguration (Customizing). Jeder Kunde kann nur seine Daten sehen und ändern. Ein System wird nicht mandantenfähig, indem man für jeden Mandanten eine eigene Instanz (Kopie) des Systems erstellt.

Einfach ausgedrückt und auf unser Thema reduziert: Die einzelnen Blogs teilen sich die Core-Files von WordPress, sind aber in Sachen Datenbank und wp-content völlig unabhängig. Ich sage es gleich: Es gibt die Möglichkeit zum Beispiel Plugins oder Themes zu teilen. Das kann evtl. hin und wieder ganz nützlich sein.

How-To

Irgendwo im Filesystem stellen wir dem ganzen Setup die Core-Files zur Verfügung. Ich schreibe ausdrücklich „irgendwo“, denn es muss nicht im Document-Root des Webservers sein. Es ist schlicht egal wo.

Core Verzeichnis

Im Core Verzeichnis eine wp-config.php anlegen, die etwa so aussieht:

1
2
<?php
require $_SERVER['DOCUMENT_ROOT'].'/wp-config.php';

Das sorgt datür, dass die „richtige“ wp-config gelesen wird.

Mandanten Verzeichniss(e)

Für jeden Mandanten legen wir nun ein Verzeichnis an. Dort zeigt der Document-Root des Webservers hin. In diesem legen wir zunächst das Verzeichnis „wp-content“ an. Dort drin befinden sich wie in einer normalen WordPress Installation auch das „plugins“, das „themes“ und das „uploads“ Verzeichnis. Diese können wir nun entweder anlegen (auf Schreibrechte für den Webserver achten) oder wir Verlinken sie zu den jeweiligen Verzeichnissen im Core.
Im Document-Root selber verlinken wir auch das core Verzeichnis. (In meinem Beispiel als ./wp/ )
Aus dem Core kopieren wir uns die index.php und ändern die letzte Zeile.
Meine schaut nun so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */


/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */

define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template */
require( './wp/wp-blog-header.php' );

Zu letzt noch eine wp-config.php im Mandanten anlegen. Neben dem üblichen Kram wie Datenbank Einträge, Salt etc. braucht es diese vier Zeilen. Das war’s….

1
2
3
4
define('WP_HOME', 'https://www.example.com');
define('WP_SITEURL', 'https://www.example.com/wp');
define('WP_CONTENT_DIR', dirname(__FILE__).'/wp-content');
define('WP_CONTENT_URL', 'https://www.example.com/wp-content');

Meine Verzeichnis-Struktur sieht nun etwa so aus.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# tree -L 2  .
.
|-- apache24
|   |-- cgi-bin
|   |-- data
|   |-- error
|   `-- icons
|-- example
|   |-- index.php
|   |-- wp -> ../wordpress-core
|   |-- wp-config.php
|   `-- wp-content
|-- example2
|   |-- index.php
|   |-- wp -> ../wordpress-core
|   |-- wp-config.php
|   `-- wp-content
`-- wordpress-core
    |-- conf
    |-- index.php
    |-- license.txt
    |-- readme.html
    |-- wp-activate.php
    |-- wp-admin
    |-- wp-blog-header.php
    |-- wp-comments-post.php
    |-- wp-config-sample.php
    |-- wp-config.php
    |-- wp-cron.php
    |-- wp-includes
    |-- wp-links-opml.php
    |-- wp-load.php
    |-- wp-login.php
    |-- wp-mail.php
    |-- wp-settings.php
    |-- wp-signup.php
    |-- wp-trackback.php
    `-- xmlrpc.php

To-Do

Eine Art Rewrite fehlt. Denn: Alle wp-admin Inhalte verstecken sich unter /wp/wp-admin/. Das ist zwar nicht weiter schlimm, aber für einige User etwas gewöhnungsbedürftig.

Quellen: Aaron Graham

Schreibe einen Kommentar

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