Umleitung der Hauptseite eines WordPress Multisite Netzwerks

 

Heute startet auch mein deutscher Blog ins “Projekt 52” für das Jahr 2017. Vielleicht hat es der ein oder andere von euch nicht erwarten können und schon letzte Woche meinen englischen Beitrag gelesen. Für alle anderen gibt es heute die deutsche Übersetzung.

Eine Multisite ohne Hauptseite

Vor zwei Wochen habe ich die Migration eines großen Projekts in eine neue Multisite Installation fertiggestellt. Bei der Multisite war es das Ziel, dass jeder Kunde eine eigene Unterseite in der Multisite bekommt. Nehmen wir für dieses Beispiel einfach mal an, die Domain wäre abc-kunden.de. Die Multisite wurde so installiert, dass sie Subdomains verwendet, während an den Kunden-Seiten gearbeitet wurde. Die Domains waren also z.B. einkunde-abc-kunden.de und einandererkunde.abc-kunden.de. Sobald die Seite fertiggestellt war, wurde eine echte Domain oder eine Subdomain des Kunden verwendet (also z.B. abc.einkunde.de und einandererkunde-plattform.de). Um diese Domains zu mappen, habe ich die Core-Funktion von WordPress verwendet, also kein zusätzliches Domain-Mapping-Plugin.

Das hat soweit alles sehr gut funktioniert. Jeder URL zu einer dieser Unterseiten hatte die korrekte Domain und die Subdomain der Unterseite war nicht mehr sichtbar. Es gab allerdings einige Probleme mit dieser Umsetzung. Zuerst einmal, war die Domain abc-kunden.de eine normale Unterseite des Multisite Netzwerks. Und zum Zweiten wurde jeder Aufruf auf eine zufällige Subdomain auf die “Netzwerk-Registrierungsseite” weitergeleitet (auch wenn die öffentliche Registrierung deaktiviert war) und die Hauptdomain war damit wieder sichtbar.

Verwendung einer leeren bzw. Wartungsseite

Zuerst hatte ich überlegt, eine leere Seite zu verwenden. Ich konnte aber kein gutes “Blank Theme” finden und mir hat die Idee auch nicht gefallen, dem Besucher der Seite “Nichts” zu zeigen und sie über einen Link dazu aufzufordern, auf eine andere Seite zu navigieren. Also war die nächste Idee, dass vielleicht eine Weiterleitung besser wäre.

Umleitung der gesamten Domain

Eine meiner Kollegen hatte dann als erstes die Idee, einfach die Domain abc-kunden.de auf eine andere Domain umzuleiten. Dies ist aber nicht möglich, denn die Hauptdomain ist notwendig, um sich in der Netzwerkverwaltung der Multisite Installation anmelden zu können.

Nur das Frontend umleiten

Ich musste es also irgendwie schaffen, dass nur Seiten im Frontend umgeleitet werden. Um eine solche Umleitung umzusetzen, bin ich auf das folgende kleine Plugin gekommen:

function multisite_mainsite_redirect() {
	if ( is_main_site() && ! is_admin() ) {
		wp_redirect( 'https://example.com/' );
		exit();
	}
}

add_action( 'init', 'multisite_mainsite_redirect' );

Sieht einfach aus, nicht wahr? Wie sich aber leider herausstellte, war die Umsetzung etwas zu einfach. Es gab ein paar Sonderfälle, die beachtet werden mussten.

Die Registrierungsseite

Selbst, wenn man das Plugin netzwerkweit aktiviert, werden nicht alle Seiten erfasst. Eine dieser Seiten ist die Registrierungsseite für neue Unterseiten der Multisite. Auch wenn die öffentliche Registrierung deaktiviert ist, erscheint beim Aufruf einer beliebigen Subdomain eine Seite. Diese enthält den Hinweis, dass eine Registrierung nicht möglich ist. Ich musste also für die Umleitung dieser Seite eine weitere Bedingung einfügen (wie die aussieht, seht ihr gleich im Ergebnis).

Konflikts mit dem WP-CLI

Nachdem ich die weite Bedingung eingefügt hatte, war ich mir eigentlich sicher, alle Fälle abgedeckt zu haben. Während der Migration der Daten vom Staging Server, habe ich aber die WP-CLI verwendet, um die gemappten URLs zu aktualisieren. Bei jedem WP-CLI Kommando erhielt ich diese Warnung und das Kommando wurde nicht ausgeführt:

$ wp
Warning: Some code is trying to do a URL redirect. Backtrace:
#0 WP_CLIUtilswp_redirect_handler(http://example.com/)
...

Damit das Plugin also auch mit dem WP-CLI funktioniert, musste ich eine weitere Bedingung einfügen.

Das Ergebnis

Nach diesen ganzen Anpassungen kam ich schließlich zu dieser kleinen Funktion für die Umleitung:

function multisite_mainsite_redirect() {
	if ( is_main_site() && ! is_admin() && 'wp-login.php' != $GLOBALS['pagenow'] && ! defined( 'WP_CLI' ) ) {
		wp_redirect( 'http://example.com/' );
		exit();
	}
}
add_action( 'init', 'multisite_mainsite_redirect' );

Die Funktion nutzt im meinen Beispiel eine statische Umleitung auf eine andere Domain. Ihr könnt aber auch recht einfach auf eine andere Unterseite umleiten oder eine andere dynamische URL.

Fazit

Ich hoffe, dass euch diese kleine Funktion auch in einem eurer Projekte mal weiterhelfen kann. Selbstverständlich habe ich es wieder als GIST veröffentlicht und ihr könnt sie euch als fertige Plugin als ZIP Datei herunterladen und bei euch installieren.

Solltet ihr Fragen haben, hinterlasst einfach einen Kommentar. Ich würde mich aber auch freuen, wenn ihr mir auch in diesem Jahr wieder Ideen für Themen nennen könnt, die euch interessieren und die ich mal hier im Blog behandeln soll. Ein paar Themen habe ich aber selbst schon zusammen 🙂

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugin, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

3 Kommentare » Schreibe einen Kommentar

  1. Das Problem mit der Registrierungsseite lässt sich auch leicht in der wp-config.php beheben:

    define('NOBLOGREDIRECT', 'beliebige-URL-wo-es-hingehen-soll');
    • Cool, danke für den Hinweis! Diese Konstante war mir noch gar nicht bekannt, dabei wird sie ja sogar in den Netzwerk-Settings beschrieben 🙂

      Es scheint aber ein unschönes Verhalten zu geben. Hat man die Konstante gesetzt, dann werden alle 404 Seiten auf den Unterseiten ebenfalls umgeleitet. Dies kann man nur verhindern, indem man den template_redirect Hook auf die Funktion maybe_redirect_404 entfernt. Dies könnte aber vielleicht wieder zu anderen Seiteneffekten führen. Ich denke ich bleibe daher erst einmal bei meiner Lösung 😉

  2. OK, ich habe den zweiten Teil der Lösung unterschlagen: Das gleichzeitige Umleiten der 404-Seiten verhindert ein
    remove_action( 'template_redirect', 'maybe_redirect_404' );
    (Am einfachsten als mu-plugin).

    Diese beiden Zeilen (einmal in der wp-config, einmal als mu-plugin) gehören bei uns zur Standard-Multisite-Konfiguration, denn das Standardverhalten von WordPress, die Umleitung auf die Registrierungsseite, ist -gelinde gesagt- sinnfrei, solange man nicht auch die freie Registrierung aktiviert hat. Und wer hat das schon…

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.