Nicht immer ist ein Login in WordPress gewollt - so habe ich für meine lokale Entwicklungsumgebung das Login deaktiviert, insofern ich es nicht brauche. Bisher sind mir zwei Möglichkeiten dieser Anforderung begegnet und diese möchte ich euch kurz vorstellen.
Entscheidet selbst, welche für euch der richtige Weg ist, wenn ihr das Login nicht bzw. nicht in dem Standard-Zeitrahmen benötigt.
Auf die harte Tour
Im ersten Codeschnippsel möchte ich meine eigene Lösung vorstellen, auf die man als erstes trifft, wenn man nach einer Lösung für diese Anforderung im Core sucht. WordPress gibt die Möglichkeit, einige Funktion direkt zu ersetzen, also ohne Plugin-Schnittstelle via Hooks. Alle Funktionen in diesem Zusammenhang findet man in wp-includes/pluggable.php. Dort findet man seit Version 2.5 von WordPress die Funktion wp_validate_auth_cookie(). Diese kümmert sich um die Prüfung des Login und diese ersetze ich in meiner lokalen Entwicklungsumgebung, die von Außen aus dem Netz nicht erreichbar ist! Die Funktion gibt bei korrektem Login die ID des Users zurück und genau das tue ich - die ID 1 für den Admin, sollte es geben, wenn dieser nach der Installation nicht verändert wurde.
Diese folgende kleine Funktion habe ich in der wp-config.php abgelegt.
/**
* Set authentication cookie.
*
* @param string $cookie Optional. If used, will validate contents instead of cookie's
* @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in
* @return bool|int False if invalid cookie, User ID if valid.
*/
//*
function wp_validate_auth_cookie( $cookie = '', $scheme = '' ) {
$user_ID = (int) 1; // admin user id
return $user_ID;
}
//*/
Der Block-Kommentar-Trick
Nun braucht man unter bestimmten Bedingungen das Login für verschieden Tests oder Anforderungen und dann muss die Funktion auskommentiert werden. In diesem Zusammenhang erkläre ich kurz die Kommentar-Zeichen in diesem Code, die vielleicht dem einen oder anderen auffallen und nichts sagen.
Es geht um folgende Zeichen:
//*
function ...
//*/
Dabei muss ich lediglich die führenden Slashs ändern in /* und der Inhalt ist auskommentiert, mehr nicht. Dieser Tipp stammt von Aleem Bawany; in seinem Artikel erklärt er es genau.
Alternativ kann man sicher auch eine Option erstellen und viele andere Wege gehen - dies ist mein Weg und der ist einfach und kontrollierbar.
Die Zeit des Cookie erweitern
Nun ist mir auf StackExchange eine weitere Lösung aufgefallen, die wesentlich sicherer ist und eventuell auch in Live-Sites einsetzbar ist. Dazu wird die Zeit des Cookie angesprochen und via Hook verändert. Im Standard von WordPress ist die „Erinnere dich an mich“-Checkbox auf 14 Tage gesetzt und die folgende Funktion ändert diesen Zeitrahmen auf ein Jahr. Der eigentliche Login bleibt also, nur die Zeit, wie lange das Login gültig ist, ändert sich.
function keep_me_logged_in_for_1_year( $expirein ) {
return 31556926; // 1 year in seconds
}
add_filter( 'auth_cookie_expiration', 'keep_me_logged_in_for_1_year' );
Diese Lösung wurde von Alex (Viper007Bond) veröffentlicht und es lohnt die Kommentare im Thread zu lesen, insbesondere zu create_function innerhalb des Filter-Hook.
Diese Funktion gehört in ein Plugin oder die functions.php des Themes als Not-Alternativ.
Zwei Lösungen mit sehr unterschiedlichen Ansätzen und Einsetzungsscenarios. Hier ist Verantwortung wichtig beim Einsatz. Vielleicht gibt es andere Lösungen, Hinweise wie immer gern in den Kommentaren.
Ich finde die erste Version praktikabler für lokale Installationen. Cookies werden bei mir nämlich beim Browser schließen alle gelöscht.
Und auch Danke für den Kommentartrick. Wieder ein paar Klicks weniger.
Prima, das spart während der Entwicklung einiges Getippe.
Die Variante mit dem Auth-Cookie eigent sich auch, wenn der WP-Admin per http-auth geschützt ist. Über den Wert $_SERVER['REMOTE_USER'] lässt sich der Benutzername abfragen, mit dem der User sich anmeldet. Dieser sollte so auch in der User-Tabelle von WP vorhanden sein. Dann User-ID abfragen und mit wp_validate_auth_cookie zurückgeben.
Man kann sich auch eine kleine PHP-Datei schreiben die die Daten per POST-Request an wp-login.php schickt. Benutzername (log) und Passwort (pwd) wären dabei fest einprogrammiert. Die Datei speichert man sich dann halt unter einem nicht zu leicht erratbaren Namen (Bsp. my_secret_login_Am3Oq5.php) und speichert sie sich als Bookmark. Der Aufruf des Blogs erfolgt dann nicht mehr über http://example.com/blog, sondern über http://example.com/my_secret_login_Am3Oq5.php.
Für Testzwecke könnte man sich die Lösung so erweitern, dass alle registrierten Benutzer aufgelistet werden und man sich mit einem Klick anmelden kann. Für Entwickler die zum Testen häufiger den Benutzer wechseln müssen eine relativ komfortable Lösung. Kommt ohne Plugin oder Fummelei an der functions.php aus. Vor allem lässt sich diese Lösung auch auf andere Software übertragen.
So Ralf, dann schnell ein Script oder muss ich es mir selber machen?
Aber die Idee ist sehr interessant, gerade beim testen von unterschiedlichen Rollen.
Der Kommentarbereich ist nicht so gut für Code-Beispiele geeignet. < & > zicken da immer rum.
Mit HTML ist es ja ganz einfach:
Für eine Anmeldung ohne jeglichen Klick, brauchst du dann halt noch etwas JavaScript das für dich beim OnLoad das Formular abschickt.
Wenn du mehrere Benutzer hast, bastelst du halt noch etwas PHP drum herum:
Das versteckte Feld mit
redirect_tosorgt dafür das du auf der Startseite landest. Lässt du es weg, landest du im Backend.Oh danke, wie zuvorkommend. Werde ich die Tage gleich mal ausprobieren.
PS: mit dem viel zu tun stimmt, aber das Huhn haste die ausgedacht!
Ich hoffe, es ist nicht unverschämt, wenn ich mir diese getippten Zeilen voller Weisheit für meinen eigenen Blog zunutze mache, oder?
Lg martin
@Martin: dazu ist es da, benutzen und freuen oder verbessern oder erweitern und teilen.
Eine wunderbare Idee, sich den Login zu sparen!
Da ich an mehreren Seiten arbeite, wird mir der modifizierte Code vom Ralf eine Menge "Login-Getippe" ersparen:
document.f1.submit();Deine Funktion mit der Session lässt sich doch auch als Plugin nutzen, oder?
Aufgebaut ist sie zumindest wie eins. Und zum lokalen testen dürfte das auch egal sein
@rob: ja, kannst du gern als Plugin nutzen, da die Funktion damit ersetzt wird.
Ahh genau diese Lösung habe ich gesucht. Ich habe hier schon mal einen guten Tipp gefunden, den mit den Konstanten in WordPress.
Aber der ist ideal für Uni Projekte mit WordPress.
Wieder mal vielen Dank
Ah Cool. Dann liese es sich ja auch realisieren mittels wp_validate_auth_cookie() und dem Unterbau der Session Funktion, das man sich den Login via Dropdown auswählen kann. Zum Beispiel für den Fall das man testen will ob der Autor genau das gleiche sieht wie der Admin etc
Hier lernt man einfach nie aus, immer wieder neue Kniffe um die Fähigkeiten von WordPress zu erweitern.
Hey =) vielen Dank für deine Darstellung, hat mir echt weitergeholfen. Du erklärst immer alles so verständlich, das gefällt mir. Mach weiter so
Kann man auf diese Weise Attacken auf den eigenen Blog vermindern?
@Raffel: nein, dies sorgt dafür, dass der Login im Blog nicht mehr notwendig ist, also eher was für Entwickler oder eine Lösung, die man damit erstellen kann.
Eventuell sehe ich das falsch, aber ich nutze dafür immer eine .htaccess Datei ! Passwort mit 20 Zeichen, passt schon
Vielen Dank für diesen Tipp. Ich wusste gar nicht, dass sowas möglich ist bzw. wäre ich niemals in der Lage gewesen das selbst zu Coden. ich werde mich da mal reinfuchsen. Hoffentlich kriege ich es hin
Hallo,
ich würde gerne den Beitrag von Ralf (#5) aufgreifen.
Hat das Stück Code jemand weiterbearbeitet? Benötige eine so beschriebene php Datei die Logindaten speichert und beim Aufruf direkt den wp-login erledigt und im Dashboard landet. Bekomme es nur selbst nicht hin
OK, für alle die ihr Blog der kompletten Online-Gemeinschaft zugänglich machen wollen, hier der 15-Zeiler mit WP-Bordmitteln:
<?php
require( dirname(__FILE__) . '/wp-load.php' );
$redirect_to = admin_url();
$credentials['user_login'] = ''; // Usernamen hier rein
$credentials['user_password'] = ''; // Passwort hier hin
$user = wp_signon($credentials);
if ( is_wp_error($user) ) {
');
die( 'Mooooooooooo.....
} else {
wp_safe_redirect( $redirect_to );
exit;
}
Oder komprimiert als 2-Zeiler
<?php require( dirname(__FILE__) . '/wp-load.php' );
') : wp_safe_redirect( admin_url() );is_wp_error( wp_signon( array( 'user_login'=>'admin', 'user_password'=>'12345' ) ) ) ? die('Mooo...
Dankeschön
Verwende es übrigens in einem geschlossenen Mitgliedsbereich der ebenfalls mit Passwort geschützt ist, keine Angst, die Gefahr ist natürlich bekannt!