Skip to content

Alles für WordPress, Webentwicklung — und mehr

🚀 Automatischer WordPress-Login in PHP: Snippet für Demo-Zugang

🚀 Automatischer WordPress-Login in PHP: Snippet für Demo-Zugang

Demo-Zugang zum WordPress-Admin-Panel ist ein Standardansatz für den Verkauf von Plugins und Themes. Ein potenzieller Käufer besucht die Seite, sieht Login und Passwort, kopiert sie, geht zu wp-login.php, fügt sie ein… Zu viele Schritte. Jeder zusätzliche Klick filtert einen Teil der Zielgruppe heraus.

Die automatische Anmeldung per Link löst dieses Problem radikal: ein Link, und der Nutzer befindet sich bereits im Admin-Panel, unter dem gewünschten Konto. Kein Kopieren und Einfügen, keine Verwirrung mit Zugangsdaten.

Nachfolgend finden Sie einen fertigen PHP-Snippet, der diesen Mechanismus zu jeder WordPress-Seite hinzufügt. Zwanzig Codezeilen, die Anpassung dauert zwei Minuten. Das Snippet ist unabhängig vom Theme, zieht keine externen Abhängigkeiten hinzu und wird wie ein normales Plugin aktiviert.

💡 Kurzer Überblick:

  • Sie fügen der Anmeldeadresse einen URL-Parameter hinzu (zum Beispiel ?autologin=demo), und wp_signon() autorisiert den Nutzer unter dem angegebenen Konto mit einer Weiterleitung in den gewünschten Bereich
  • Das Snippet ist als separates WordPress-Plugin formatiert: Aktivieren Sie es, und es funktioniert sofort, deaktivieren Sie es, und es ist ausgeschaltet, das Theme ist nicht daran gebunden
  • Die Basisversion bedient ein Konto, die erweiterte Version unterstützt beliebig viele Konten mit unterschiedlichen Rollen und Zielpunkten
  • Anpassung für Ihr Projekt: Ändern Sie drei Werte im Code (Login, Passwort, URL-Schlüssel), laden Sie das Plugin auf die Seite und erhalten Sie die Anmeldung per Link

So funktioniert die automatische Anmeldung: wp_signon-Mechanik

Das Kernstück der gesamten Konstruktion ist die Funktion wp_signon(). Sie nimmt Anmeldedaten entgegen: Login, Passwort und das „Angemeldet bleiben"-Flag und autorisiert den Nutzer dann genau wie das Standardformular auf wp-login.php. Der Unterschied besteht darin, dass der Aufruf programmatisch erfolgt, ohne menschliches Zutun. Der Nutzer folgt einfach dem Link und befindet sich im System.

Der Hook after_setup_theme wird ausgelöst, bevor Header gesendet werden, was entscheidend ist, da wp_signon() ein Auth-Cookie setzt und Cookies vor jeglicher Ausgabe an den Browser gesendet werden müssen. Wenn Sie den Aufruf an init oder einen späteren Hook hängen, funktioniert die Anmeldung möglicherweise nicht. Genau deshalb ist das Snippet als separates Plugin formatiert und nicht in die functions.php des Themes eingefügt: Das Plugin wird in den sehr frühen Phasen des WordPress-Lebenszyklus geladen, was garantiert, dass der Hook rechtzeitig ausgeführt wird.

Vollständiger Code für WordPress Auto-Login-Plugin

Hier ist das minimale funktionsfähige Plugin:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Version: 1.0.0
6Author: Harri Bell-Thomas
7*/
8
9function autologin() {
10 if ( $_GET['autologin'] !== 'demo' ) {
11 return;
12 }
13
14 $creds = array(
15 'user_login' => 'demo',
16 'user_password' => 'demo',
17 'remember' => true,
18 );
19
20 $user = wp_signon( $creds, false );
21
22 if ( ! is_wp_error( $user ) ) {
23 wp_redirect( admin_url() );
24 exit;
25 }
26}
27add_action( 'after_setup_theme', 'autologin' );

Lassen Sie uns das Zeile für Zeile aufschlüsseln. Die Bedingung $_GET['autologin'] === 'demo' prüft, ob der erforderliche Parameter in der URL übergeben wird: wp-login.php?autologin=demo. Das Array $creds enthält Login, Passwort und das „Angemeldet bleiben"-Flag. wp_signon() mit dem Parameter false bedeutet: Kein sicheres Cookie verwenden (geeignet für lokale Entwicklung und Staging-Seiten ohne HTTPS). Bei Erfolg leitet wp_redirect( admin_url() ) den Nutzer zum Admin-Panel weiter. Bei einem Fehler (falsches Passwort, nicht existierender Nutzer) zeigt WordPress das Standard-Anmeldeformular an, ohne preiszugeben, dass ein automatischer Anmeldeversuch stattgefunden hat.

Anpassung für Ihr Projekt

Um das Snippet anzupassen, genügt es, drei Werte zu ändern: den URL-Parameter, Login und Passwort. Im nächsten Block sind sie der Einfachheit halber an den Anfang der Funktion verschoben:

1function autologin() {
2 $param = 'autologin';
3 $user = 'dummy';
4 $pass = 'pa55word';
5
6 if ( $_GET[ $param ] !== $user ) {
7 return;
8 }
9
10 $creds = array(
11 'user_login' => $user,
12 'user_password' => $pass,
13 'remember' => true,
14 );
15
16 $login = wp_signon( $creds, false );
17
18 if ( ! is_wp_error( $login ) ) {
19 wp_redirect( admin_url() );
20 exit;
21 }
22}

Drei Regeln bei der Anpassung, die Ihnen stundenlange Fehlersuche ersparen.

Erstens: Der Wert des Parameters $user darf nicht mit reservierten WordPress-Schlüsseln übereinstimmen. Vier Schlüssel sind reserviert: loggedout für die Abmeldung, action für das Zurücksetzen des Passworts, redirect_to für Weiterleitungen nach der Anmeldung und wp_lang für den Wechsel der Spracheinstellung. Wenn Sie eines dieser Wörter verwenden, funktioniert die automatische Anmeldung entweder nicht oder stört das Standardverhalten des Kerns.

Zweitens: Das Passwort wird im Klartext im Plugin-Code gespeichert, daher verwenden Sie dieses Snippet niemals für Administrator- oder Redakteurskonten auf einer Live-Seite. Ein Demo-Nutzer mit der Rolle „Abonnent" oder allenfalls „Redakteur" ist akzeptabel. Ein Administrator mit automatischer Anmeldung per Link ist eine Sicherheitslücke, die ein Angreifer in Sekundenschnelle findet.

Drittens: Wenn die Seite mit HTTPS läuft, ersetzen Sie false durch true im zweiten Argument von wp_signon(). Dies aktiviert das sichere Cookie und verhindert das Abfangen des Auth-Tokens während der Netzwerkübertragung.

Die Anmeldeadresse sieht folgendermaßen aus: https://your-site.com/wp-login.php?autologin=dummy. Wenn der Nutzer ihr folgt, landet er sofort im Admin-Panel. Keine Zwischenbildschirme, kein Kopieren und Einfügen von Zugangsdaten.

Was, wenn die Demo-Seite das Produkt aus verschiedenen Rollen zeigt? Der Administrator sieht das Einstellungs-Panel, der Redakteur die Veröffentlichungsoberfläche, der Abonnent den persönlichen Bereich. Für dieses Szenario erweitern wir das Snippet, um mehrere Konten zu unterstützen:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Description: Automatic login for demo accounts. Configure accounts in the array below.
6Version: 1.0.0
7Author: Harri Bell-Thomas
8*/
9
10$autologin_param = 'autologin';
11
12$autologin_accounts = array(
13 array(
14 'user' => 'demo',
15 'pass' => 'demo',
16 'location' => 'wp-admin',
17 ),
18 array(
19 'user' => 'editor_demo',
20 'pass' => 'demo',
21 'location' => 'wp-admin/post-new.php',
22 ),
23);
24
25function autologin() {
26 global $autologin_param, $autologin_accounts;
27
28 foreach ( $autologin_accounts as $account ) {
29 if ( $_GET[ $autologin_param ] === $account['user'] ) {
30 $creds = array(
31 'user_login' => $account['user'],
32 'user_password' => $account['pass'],
33 'remember' => true,
34 );
35
36 $user = wp_signon( $creds, false );
37
38 if ( ! is_wp_error( $user ) ) {
39 wp_redirect( admin_url( $account['location'] ) );
40 exit;
41 }
42 }
43 }
44}
45add_action( 'after_setup_theme', 'autologin' );

Die Mechanik ist dieselbe, aber das Array $autologin_accounts speichert die Anmeldedaten aller Demo-Nutzer, und foreach iteriert durch sie und sucht nach einer Übereinstimmung mit dem Wert des URL-Parameters. Das Hinzufügen eines neuen Kontos beschränkt sich auf das Kopieren des Array-Blocks mit neuen Werten für user, pass und location.

Der Parameter location akzeptiert jeden relativen Pfad innerhalb von /wp-admin/: zum Beispiel options-general.php für die Einstellungsseite, edit.php für die Beitragsliste oder post-new.php zum Erstellen eines neuen Beitrags. Sie können auch eine vollständige URL für die Weiterleitung zum Frontend angeben, ersetzen dann aber admin_url( $account['location'] ) im Code durch $account['location'].

Der Einstiegspunkt ist derselbe: https://your-site.com/wp-login.php?autologin=editor_demo, und der Nutzer landet auf der Seite zum Erstellen von Beiträgen statt im Admin-Hauptbereich. Für den Betreiber der Demo-Seite bedeutet dies volle Kontrolle über den ersten Eindruck: Jeder Nutzertyp sieht genau den Teil des Produkts, der für seine Interessen relevant ist.

⁉️🤔 Häufig gestellte Fragen

Ist es sicher, Passwörter im Plugin-Code zu speichern?

Nein, das ist nicht sicher. Das Snippet wurde für Demo-Seiten konzipiert, auf denen Konten bewusst öffentlich sind und keine echten Berechtigungen haben. Auf einer Produktionsseite mit echten Nutzern ist dieser Ansatz inakzeptabel: Das Passwort im Klartext kann bei jeder Code-Überprüfung offengelegt werden. Für Produktionsszenarien sollten Sie einen Mechanismus mit Einmal-Token oder SSO über die REST-API mit Nonce-Verifizierung in Betracht ziehen.

Warum nicht die wp_login-Aktion, sondern direkt wp_signon?

Der Hook wp_login wird nach einer erfolgreichen Anmeldung ausgelöst, er führt die Autorisierung nicht selbst durch. wp_signon() ist die Funktion, die den Nutzer authentifiziert: Sie prüft das Passwort über wp_authenticate(), setzt das Cookie und löst als Folge wp_login aus. Wenn Sie einen Nutzer nur programmatisch autorisieren müssen, ist wp_signon Ihr Werkzeug.

Kann ich das Snippet in die functions.php einfügen, anstatt ein separates Plugin zu verwenden?

Ja, der Code funktioniert auch in der functions.php des Themes. Aber ein Plugin ist komfortabler: Die automatische Anmeldung ist nicht an das Theme gebunden und geht bei einem Theme-Wechsel nicht kaputt. Außerdem kann das Plugin mit einem Klick deaktiviert werden, ohne Dateien auf dem Server bearbeiten zu müssen.

Was tun, wenn der Nutzer nach der Anmeldung in is_user_logged_in nicht als autorisiert gilt?

Dies ist eine bekannte Besonderheit von wp_signon(), wenn es vor dem Hook init aufgerufen wird: Das Cookie ist gesetzt, aber die globale Variable $current_user ist noch nicht aktualisiert. Die Lösung besteht darin, unmittelbar nach einem erfolgreichen wp_signon() wp_set_current_user( $user->ID ) zwangsweise aufzurufen. In unserem Snippet ist dies nicht kritisch, da sofort eine Weiterleitung folgt, aber in Szenarien ohne Weiterleitung ist die Zeile zwingend erforderlich.

Funktioniert das Snippet mit Multisite?

Ja, aber mit einer Einschränkung. wp_signon() autorisiert den Nutzer innerhalb der aktuellen Seite im Netzwerk. Wenn das Konto nur auf einer der Unterseiten existiert, funktioniert die automatische Anmeldung auf den anderen nicht. Für eine netzwerkweite Authentifizierung verwenden Sie eine Kombination aus wp_signon() und wp_set_auth_cookie() mit erzwungener Cookie-Installation für die Hauptdomain.

Auto-Login-Snippet: Das Fazit

Fünfzehn Zeilen PHP beseitigen die Hauptreibung im Demo-Seiten-Trichter: das Kopieren von Login und Passwort. Ein Link, und der Besucher ist im Produkt, mit der Rolle und in dem Bereich, den Sie gewählt haben.

Die Basisversion deckt das Szenario „ein Demo-Nutzer" ab, die erweiterte Version eine beliebige Anzahl von Rollen mit unterschiedlichen Weiterleitungspunkten. Beide sind unabhängig vom Theme, benötigen keine Drittanbieter-Plugins und sind in einer Minute aktiviert.

Die wichtigste Sicherheitsregel lautet: Erhöhen Sie keine Berechtigungen. Ein Demo-Nutzer mit der Rolle „Abonnent" oder allenfalls „Redakteur" ist akzeptabel. Ein Administrator mit automatischer Anmeldung per Link ist eine Sicherheitslücke, die ein Angreifer in Sekundenschnelle findet.

Wenn der Demo-Zugang für Sie ein Vertriebskanal ist, wird die automatische Anmeldung von einer „netten Ergänzung" zu einem obligatorischen Conversion-Element. Ein Link statt Login und Passwort ist der Unterschied zwischen „Ich probiere es später" und „Ich probiere es jetzt".