问题描述

当我在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。