Przyczyną wp_attempt_focus
tego problemu jest funkcja JavaScript . Funkcja jest uruchamiana wkrótce po załadowaniu strony, usuwa formularz i skupia się na nim, zmuszając użytkowników do ręcznego wprowadzania danych logowania.
Chrome automatycznie wpisuje nazwę użytkownika i hasło, zaledwie milisekundy, zanim funkcja JS wyczyści pole. Chrome nieprawidłowo odbiera zmiany, wyświetlając wypełnione pola w kolorze żółtym, mimo że pola są faktycznie puste.
Chociaż doceniam funkcję autofokusa, nie mogę znaleźć dobrego powodu, dla którego ktoś chciałby, aby formularz był automatycznie czyszczony.
Źródło
Niestety, funkcja została zakodowana na stałe wp-login.php
w liniach 913-930 (WordPress 4.0). Zmiana wp-login.php
pliku jest złym pomysłem, ponieważ można go zastąpić w każdej nadchodzącej aktualizacji WordPress. Będziemy musieli więc zastosować trochę „hakowania”.
Łatwa naprawa
wp_attempt_focus
Funkcja jest wywoływana, jeśli formularz nie ma błędów. Mamy szczęście - sprawdzanie błędów odbywa się za pośrednictwem PHP. Oznacza to, że możemy po prostu uniemożliwić uruchomienie funkcji przez sfałszowanie błędu formularza we właściwym czasie za pomocą akcji WP. Wybrałem login_form
akcję, ponieważ akcja zawsze uruchamia się po obsłudze błędów, tuż przed wywołaniem JS. Dodaj następujący kod do motywu functions.php
(lub pliku wtyczki):
add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
global $error;
$error = TRUE;
}
Hackish fix
Powyższa poprawka zapobiega całkowitemu odpaleniu funkcji, co oznacza, że nie uzyskasz również odpowiedniego autofokusa. Jest na to inny sposób: buforowanie danych wyjściowych HTML i modyfikowanie ich ob_start
, inspirowane przez Geeklab . Buforowanie pozwala nam usunąć określone fragmenty kodu - w tym przypadku część automatycznego czyszczenia d.value = ''
. Nie zapomnij jednak opróżnić bufora.
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();
}