Die JavaScript-Funktion wp_attempt_focus
verursacht dieses Problem. Die Funktion wird kurz nach dem Laden der Seite ausgelöst, löscht das Formular und konzentriert sich darauf. Benutzer müssen ihre Anmeldeinformationen manuell eingeben.
Chrome gibt den Benutzernamen und das Passwort automatisch ein, nur Millisekunden bevor die JS-Funktion das Feld löscht. Chrome nimmt die Änderungen nicht richtig auf und zeigt gelb ausgefüllte Felder an, obwohl die Felder tatsächlich leer sind.
Obwohl ich die Autofokus-Funktionalität schätze, kann ich mir keinen guten Grund vorstellen, warum jemand möchte, dass das Formular automatisch gelöscht wird.
Die Quelle
Leider wurde die Funktion wp-login.php
in den Zeilen 913-930 (WordPress 4.0) fest codiert. Das Ändern der wp-login.php
Datei insgesamt ist eine schlechte Idee, da sie bei jedem kommenden WordPress-Update überschrieben werden kann. Wir müssen also auf ein bisschen "Hacking" zurückgreifen.
Die einfache Lösung
Die wp_attempt_focus
Funktion wird aufgerufen, wenn das Formular keine Fehler enthält. Wir haben Glück - die Fehlerprüfung erfolgt über PHP. Dies bedeutet, dass wir einfach verhindern können, dass die Funktion ausgelöst wird, indem wir mithilfe von WP-Aktionen zum richtigen Zeitpunkt einen Formularfehler vortäuschen. Ich habe die login_form
Aktion ausgewählt, da die Aktion immer nach der Fehlerbehandlung direkt vor dem JS-Aufruf ausgelöst wird. Fügen Sie dem Thema functions.php
(oder der Plugin-Datei) den folgenden Code hinzu :
add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
global $error;
$error = TRUE;
}
Die hackige Lösung
Die obige Korrektur verhindert, dass die Funktion vollständig ausgelöst wird, was bedeutet, dass Sie auch keinen richtigen Autofokus erhalten. Es gibt noch einen anderen Weg: die HTML-Ausgabe zu puffern und über zu ändernob_start
, wie von Geeklab inspiriert . Durch das Puffern können wir bestimmte Teile des Codes entfernen - in diesem Fall den Autoclear-Teil d.value = ''
. Vergessen Sie jedoch nicht, den Puffer zu leeren.
add_action("login_form", "kill_wp_attempt_focus_start");
function kill_wp_attempt_focus_start() {
ob_start("kill_wp_attempt_focus_replace");
}
function kill_wp_attempt_focus_replace($html) {
return preg_replace("/d.value = '';/", "", $html);
}
add_action("login_footer", "kill_wp_attempt_focus_end");
function kill_wp_attempt_focus_end() {
ob_end_flush();
}