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 Plugins, 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.

9 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…

  3. Sehr schöne und einfache Lösung. Sie rettet mir die Links der alten Jom Seite. Eine Kleinigkeit für meinen Fall noch ergänzt für den Google-Bot:

    wp_redirect( 'http://example.com/index.php' ,301 );
    

    So können WP MUI und Joomla friendlich beide im root laufen

    • Vielen Dank für den Kommentar. Sehe ich dsa richtig, dass dann WordPress immer seine URLs mit index.php beginnen muss? Das ist nicht wirklich schön 😉 Wäre nicht vielleicht die Installation der Multisite in einem Unterordner an dieser Stelle ein Lösung?

  4. Hallo,

    danke für diesen Beitrag, der mich schon weitergeführt hat!
    Leider bin ich noch nicht ganz am Ziel.
    Es geht um Folgendes:
    Ich habe eine WordPressinstallation auf einer Hauptseite, sagen wir “www.privatverlag.de”. Eine Kundin hat diesen Verlag und möchte sich als Lektorin auf der Startseite dieses ihres eigenen Verlags vorstellen, also kann auch ruhig die Adresse “www.privatverlag.de/frau-sowieso-lektorat” bestehen, ihre Arbeit(en) als Lektorin sollen ja gerade in den Verlag eingebunden sein. Ich soll diese letztgenannte Seite designen und möchte mit einem anderen Theme arbeiten, als dies Entwickler für die Verlagsseite der Kundin früher (auf der Hauptseite) installiert haben. Daher habe ich nun eine WP-Multisite-Installation gemacht, so dass ich als Sub-Verzeichnis eben die eigene Seite “www.privatverlag.de/frau-sowieso-lektorat” als Nebenseite mit eigenem Theme usw. anlegen konnte. Soweit so gut. Die Kundin hätte aber gerne, dass wenn man die Adresse “www.privatverlag.de” aufruft, automatisch zuerst mal ihre Lektoratsseite (also “www.privatverlag.de/frau-sowieso-lektorat”) erscheint. Leider kann ich aber in der Multisite-WP-Installation nicht die Nebenseite als Indexseite setzen – dies ist nur mit Seiten der Mainsite möglich. Vielleicht stehe ich da mit dem Domain-Mapping innerhalb der Multisite auch auf dem Schlauch, aber ich habe jetzt mal das Plugin probiert, um wenigstens prinzipiell bei Aufruf der Seite “www.privatverlag.de/frau-sowieso-lektorat” auf “www.privatverlag.de” zu gelangen. Das Problem dabei ist, dass aber nun alle Seiten der Mainsite zu “www.privatverlag.de/frau-sowieso-lektorat” führen. Die Kundin möchte aber eben, dass zuerst ihre Lektoratsseite erscheint und dann auf dieser ein Link zur Verlagsseite mit deren Unterverzeichnissen führt.
    Vielleicht brauche ich das hier vorgelegte Plugin gar nicht, vielleicht aber brauche ich es doch, nur in leicht umgeschriebener Form.
    Ich wäre sehr dankbar, wenn mir da aus dieser “Schleife” geholfen werden könnte.
    Ich bitte um Entschuldigung, dass ich es inhaltlich so ausführlich beschrieben habe. Letztlich geht es technisch um die Frage: Wie kann man die Nebenseite einer Multisite-Installation als die Indexseite der Mainsite setzen, wobei die WP-Installation auf der Mainsite liegt?
    Ps.: Ich arbeite und teste derzeit mit einem Duplikat der gesamten WP-Installation der Seite lokal auf dem Computer. Daher macht es wenig Sinn, die Website anzugeben.

  5. Hallo? Funktioniert das Plugin noch immer? ( diese Artikel ist doch 6 Jahre alt) Oder gibts heute andere Lösung ? Danke für die Antwort.

    • Hallo Ziti,

      diese Lösung wird so noch immer auf einer Seite eingesetzt und funktioniert weiterhin problemlos. WordPress hat an diesem Teil in den letzten Versionen nichts geändert und mir wäre auch keine andere Lösung bekannt.

Schreibe einen Kommentar

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