Permalink

1

WP-Tutorial: Redirect-Plugin schreiben

Vor kurzem führte ich den Umzug eines WordPress-Blogs auf einen neuen Server mit neuer Domain durch. Alle Artikel wurden unverändert übernommen und auch die Permalinks sind gleich geblieben, sodass sich praktisch nur die Domain geändert hat.

Da es noch viele Zugriffe auf die alte Domain gab, die jetzt nicht ins Leere laufen sollten, musste eine Umleitung her, die die Anfragen an die Artikel auf die neue Seite leiten würde. Deswegen habe ich kurzerhand ein kleines Plugin geschrieben, das ich hier vorstellen möchte.

Zuerst einmal schreibe ich die Grundstruktur für ein Plugin und speichere sie als permanent-redirect.php im Plugin-Verzeichnis der WordPress-Installation ab.

<?php
/*
Plugin Name: Permanent Redirect
Description: Dieses Plugin leitet alle Anfrage auf einen anderen Server um
Author: Artur Weigandt
Version: 1.0
Author URI: http://www.wlabs.de
*/
?>

Jetzt suche ich nach einem Weg, den angefragte URI herauszubekommen. Mein Blick fällt direkt auf die $_SERVER und nach einer kurzen Suche auf php.net finde ich auch schon $_SERVER[‚REQUEST_URI‘].

$_SERVER[‚REQUEST_URI‚] Der URI, der angegeben wurde, um auf die aktuelle Seite zuzugreifen, beispielsweise ‚/index.html‚.

Genau das brauche ich. Wenn ich nur noch die neue Domain davor stelle, habe ich schon alles, was ich wollte.

Schnell schreibe ich eine kleine Funktion:

function my_redirect()
{
	$new_domain = "http://www.example.com";
	header("Location:" . $new_domain . $_SERVER['REQUEST_URI']);
}

Damit die Funktion auch von WordPress aufgerufen wird, muss ich sie in einem action hook aufrufen. Da die Anfrage so schnell wie möglich umgeleitet werden soll, und header(„Location:“); vor jeglicher Zeichenausgabe an den Browser aufgerufen werden muss, muss meine Funktion vor der Template-Ausgabe aufgerufen werden.

In der WordPress-Dokumentation habe ich in der Action-Reference „init“ gefunden:

init: Runs after WordPress has finished loading but before any headers are sent. Useful for intercepting $_GET or $_POST triggers.

Danach habe ich gesucht. Ich setze also folgenden action hook:

add_action('init', 'my_redirect');

Mein gesamtes Plugin sieht also bisher so aus und ist bereit für einen ersten Test.

<?php
/*
Plugin Name: Permanent Redirect
Description: Dieses Plugin leitet alle Anfrage auf einen anderen Server um
Author: Artur Weigandt
Version: 1.0
Author URI: http://www.wlabs.de
*/

function my_redirect()
{
	$new_domain = "http://www.example.com";
	header("Location:" . $new_domain . $_SERVER['REQUEST_URI']);
}

add_action('init', 'my_redirect');
?>

Nachdem ich mich im Admin-Bereich angemeldet habe, gehe ich zu den Plugins und installiere das Plugin „Permanent Redirect“.

Der erste Testlauf ist schon sehr vielversprechend. Jede Anfrage wie www.old-domain.com/mein-artikel wird zu der neuen Domain www.example.com/mein-artikel umgeleitet.

Jetzt möchte ich zurück ins Backend, um das Plugin erst einmal wieder zu deaktivieren, da es noch nicht benötigt wird. Dummerweise wird jetzt aber auch meine Anfrage an die wp-login.php an den neuen Server geleitet. Ich habe mich mit dem Plugin also selbst ausgesperrt.

Das ist ärgerlich. Daran hätte ich auch direkt denken können. Ich speichere mir also eine Kopie der permanet-redirect.php auf meinem Computer ab und lösche die Datei auf dem Server.

Nun gelingt der Login. Von WordPress bekomme ich noch den Hinweis, dass mein „Permanent Redirect“ Plugin deaktiviert wurde, da die Datei nicht mehr gefunden werden konnte.

Nun öffne ich die lokale Kopie mit dem Editor. Ich muss also eine Abfrage einbauen, die es mir später erlaubt, weiterhin ins Backend zu gelangen, während alle anderen Anfragen ordnungsgemäß umgeleitet werden.

Am einfachsten gelingt mir das, in dem ich abfrage, ob in $_SERVER[‚PHP_SELF‘] die wp-login.php aufgerufen wird. Außerdem sollte ich noch die $_SERVER[‚REQUEST_URI‘] nach „wp-admin/“ abfragen, damit ich nach dem Login auch ins Backend gelange und nicht erneut umgeleitet werde.

So sieht meine Abfrage aus:

if( strstr($_SERVER['PHP_SELF'], 'wp-login.php') ||
strpos($_SERVER['REQUEST_URI'], 'wp-admin/') != false )
{
	return;
}

Diese Abfrage setze ich dann in die Funktion ein und mein Plugin ist fertig.

Hier nochmal das gesamte Plugin:

<?php
/*
Plugin Name: Permanent Redirect
Description: Dieses Plugin leitet alle Anfrage auf einen anderen Server um
Author: Artur Weigandt
Version: 1.0
Author URI: http://www.wlabs.de
*/

function my_redirect()
{
	$new_domain = "http://www.example.com";

	if( strstr($_SERVER['PHP_SELF'], 'wp-login.php') ||
strpos($_SERVER['REQUEST_URI'], 'wp-admin/') != false )
	{
		return;
	}

	header("Location:" . $new_domain . $_SERVER['REQUEST_URI']);
}

add_action('init', 'my_redirect');
?>

Nach dem Hochladen installiere ich das Plugin und teste noch einmal den Login. Diesmal klappt der Login und ich kann auch weiterhin im Backend arbeiten, während alle Anfragen im Frontend umgeleitet werden.

Ich hoffe, dass dir dieses kleine Tutorial geholfen hat. Du kannst mir gerne einen Kommentar hinterlassen.

Autor: Artur

Der technikinteressierte und bibeltreue Christ Artur Weigandt bloggt über Datenschutz, Webprogrammierung, sicheren Umgang mit dem Internet und die Bibel. Er arbeitet an der christlichen Community youthweb.net mit, programmiert Webapplikationen und beteiligt sich bei diversen Open Source Projekten.

1 Kommentar