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 🙂

Das Projekt 52 geht in die nächste Runde

Erst einmal möchte ich euch allen ein frohes neues Jahr wünschen. Der erste Tag des neuen Jahres ist gleichzeitig auch der letzte Tag der 52. Kalenderwoche 2016 und somit das Abschluss von Projekt 52.

Viel Arbeit, aber auch viel Spaß

Ich habe ja schon letzte Woche zum Ende des Adventskalenders ein kleines Resümee gezogen und euch ein paar Statistiken präsentiert. Das möchte ich jetzt an dieser Stelle nicht noch einmal wiederholen. Nur so viel: das Schreiben der über 70 Artikel war zwar wirklich verdammt viel Arbeit – ich hätte vielleicht mal die Zeit stoppen sollen:) – aber es hat auch wirklich viel Spaß gemacht und ich habe durch die Recherche zu den Artikeln auch immer viel gelernt.

Weiterlesen →

Rückblick auf die vergangenen 13 Monate und Ausblick auf das nächste Jahr

Am 1. Dezember im letzten Jahr hatte ich die verrückte Idee, einfach mal so spontan einen Adventskalender zu starten. Heute nun schreibe ich den letzten Beitrag des diesjährigen Adventskalenders und vielleicht auch den letzten für dieses Jahr. In dieses Zeit ist aber noch mehr passiert. Ich möchte daher heute zu Heiligabend ein wenig zurückblicken.

Mein Blog lebt wieder

Wenn ich später auf veröffentlichen klicke wird das mein 249 Artikel sein. Der Blog ist heute etwa 7,5 Jahre alt. Alleine in den vergangenen 13 Monaten kamen dann stolze 96 Beiträge dazu. Davon zwei 24 Adventskalender Beiträge und 48 weitere entstanden. Im #projekt52 habe ich es in den vergangenen 51 Kalenderwochen geschafft, wirklich einmal pro Woche mindestens einen Beitrag zu schreiben, wenn auch manchmal auf die letzte Sekunde 🙂

Das Schreiben der Artikel war natürlich verdammt viel Arbeit. Für manche habe ich vielleicht nur eine halbe Stunde gebraucht. An anderen, gerade an denen mit viel Code, saß ich 5 Stunden oder mehr. Aber ich habe durch das Schreiben auch so viel neues gelernt, dass ich es nicht bereue, dieses Projekt mitzumachen.

Weiterlesen →

Wie ich Neues rund um WordPress dazulerne

In meinem ersten Beitrag hatte ich euch ja gebeten, mir eure Themenwünsche mitzuteilen. Bego hatte mich daraufhin gefragt, woher ich denn meine Informationen bekomme, um mich weiterzubilden. im Vorletzten Beitrag des diesjährigen Adventskalenders, möchte ich noch einmal das Thema aufgreifen.

Andere Blogs lesen/abonnieren

Noch vor zwei Jahren war ich ein regelrechter RSS-Feed-Junkie. Ich habe täglich Dutzende bis hunderte Feed Items gescannt und mir einige Artikel davon auch wirklich durchgelesen. Viele andere habe ich mit in Pocket gespeichert. Mit der Zeit haben sich dort über 1100 Items (die genau Zahl kann ich nicht mehr sehen) in einer “Liste an Beiträgen, die ich vermutlich niemals lesen werde” angesammelt 😉 Aber gut, dass ich sie mir mal gespeichert habe, sollte mir mal langweilig werden 🙂

Weiterlesen →

Code-Snippets auf meinem Blog zur Verbesserung von Kommentaren

Morgen geht es für mich sehr früh in den wohlverdienten Weihnachtsurlaub. Daher musste ich mir für heute Abend noch ein Thema raussuchen, damit ihr nicht auf euren Adventskalenderartikel verzichten müsst. Aber woher bekommt man als Entwickler mal eben schnell ein schönes und kurzes Thema her? Richtig, aus dem eigenen Code. Und so möchte ich euch heute drei kleine Code-Snippets präsentieren, mit denen ich die Kommentare hier im Blog verbessere.

Shortcodes im Kommentar erlauben

Mein Blog ist ja sehr codelastig. Nicht selten kommt es also vor, dass auch in einem Kommentar Quellcode verwendet wird. Damit dieser ebenso hübsch aussieht wie hier im Beitrag, habe ich die Shortcodes des Syntaxhighlighter Plugins auch für Kommentar erlaubt. Ermöglicht wird das mit nur einer einzelnen Zeile Code:

Weiterlesen →