問題描述

當我在 Chrome 上打開登錄屏幕時,瀏覽器會自動使用我的用户名和密碼填寫表單。但是,當我點擊提交按鈕時,我會收到以下消息:

ERROR: The password field is empty.

為自動填寫的密碼添加空間並再次刪除它可以讓我登錄。發生了什麼?

最佳解決方案

JavaScript 函數 wp_attempt_focus 導致此問題。該功能在頁面加載後立即啓動,清除表單並對其進行聚焦,強制用户手動輸入其登錄信息。

Chrome 正在自動填寫用户名和密碼,在 JS 功能清除該字段之前幾毫秒。 Chrome 無法正確接收更改,即使字段實際為空,也會顯示黃色填充字段。

雖然我欣賞自動對焦功能,我不能想到任何人都希望表單自動清除的好理由。

來源

可悲的是,該功能已經在 913-930 行 (WordPress 4.0) 中的 wp-login.php 中進行了硬編碼。更改 wp-login.php 文件是一個壞主意,因為它可能會被覆蓋在任何即將到來的 WordPress 更新。所以我們不得不求助於一些’hacking’ 。

容易修復

如果表單沒有錯誤,則調用 wp_attempt_focus 函數。我們在運氣 – 錯誤檢查是通過 PHP 完成的。這意味着我們可以通過使用 WP 操作在正確的時間偽造表單錯誤來簡單地防止該函數觸發。我選擇了 login_form 操作,因為在 JS 調用之前,操作總是在錯誤處理之後觸發。將以下代碼添加到主題的 functions.php(或插件文件) 中:

add_action("login_form", "kill_wp_attempt_focus");
function kill_wp_attempt_focus() {
    global $error;
    $error = TRUE;
}

黑客修復

上面的修復可以防止功能完全燒燬,這意味着您也不會獲得正確的自動對焦。還有另一種方法:緩衝 HTML 輸出並通過 ob_start 進行修改,受 Geeklab 的啓發。緩衝允許我們刪除代碼的特定部分 – 在這種情況下,自動清除部分 d.value = ''。不要忘了沖洗緩衝區。

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();
}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。