Einlasskontrolle: Referrer in WordPress prüfen

Die Pandemie zwingt viele meiner Kunden nun endlich mal die Digitalisierung ihrer Workflows voranzutreiben. Leider ergeben sich dabei manchmal kuriose Anforderungen. Nun hatte ich letztens ein interessantes Problem zu lösen. Der Kunde wollte ihre Kurse auch online anbieten. So weit kein Problem. Nun gab es aber auch die Möglichkeit für eine bestimmte Personengruppe diese Kurse kostenfrei zu besuchen, da ein Drittanbieter zahlt. Bei den realen Treffen wurde einfach eine Liste der Personen geführt und am Ende mit dem Drittanbieter abgerechnet.

Nun sollte ich so eine Liste auch online umsetzen. Aber wie?

Da ich eine Teilnahme nachweisen musste, benötigte ich die Daten der Personen. Also baute ich ein Formular, mit dem die Daten (Name und E-Mail) erfasst wurden. Die Formulardaten wurden gespeichert und nach erfolgreichem Absenden wurde weitergeleitet auf die Kursinhalte. So lagen die Anmeldedaten für den Online-Kurs vor und die Abrechnung konnte weiterhin stattfinden.

Ich warnte noch davor, dass es diese Lösung sehr fragil ist, da es keine Prüfung gab. Aber man vertraute auf die Ehrlichkeit der eigenen Kunden und dass schon niemand das Lesezeichen abspeichert und sich brav nach jedem Kurs wieder abmeldet.

Was in der Testphase noch gut klappte, war natürlich irgendwann doch ein Problem. Das Angebot wurde gut angenommen, die Frequenz der Kurse erhöht und nun war ein 14 Tage gültiger Login-Cookie und Lesezeichen speichernde Kunden plötzlich doch ein Problem, das gelöst werden musste.

Als erstes überlegte ich den Login-Cookie zu begrenzen, aber das müsste ich auf bestimmte Mitglieder beschränken, damit ich und die Redakteure nicht selbst limitiert wurden. Außerdem war das eine sehr unflexible Lösung.

Dann hatte ich eine Idee. Ich prüfte auf der Kursinhalte-Seite, ob der Referrer die Formularseite war, die als Anmeldung diente. Falls dem nicht so war, leitete ich weiter auf eben dieses Anmeldeformular.

Der Code ist recht überschaubar:

function my_referrer_check () {

	// Bail early if not relevant.
	if ( ! is_page( 'kursinhalt' ) ) {
		return;
	}

	// Get referrer.
	$referer = wp_get_referer();

	// Redirect to login if not coming from there.
	if ( strpos( $referer, 'https://example.de/anmeldung/' ) === false ) {
		nocache_headers();
		wp_safe_redirect( home_url( '/anmeldung/' ) );
		exit;
	}

}
add_action( 'template_redirect', 'my_referrer_check' );

Das Ganze wird nur auf der Seite „Kursinhalt“ ausgeführt, holt sich den Referrer und leitet gegebenenfalls auf die Anmeldeseite, wenn dies nicht die referenzierende Seite war.

Die üblichen Unsicherheiten bei Referrern kann ich ignorieren, da es sich ja um eine interne Verlinkung handelt und ich so selbst die Kontrolle über die Faktoren habe, die einen leeren Referrer zur Folge haben könnten.

Der Kunde war zufrieden und die Abrechnung stimmte wieder 🙂

Schreibe einen Kommentar

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