回答:
JavaScript関数wp_attempt_focus
がこの問題の原因です。この関数は、ページの読み込み直後に起動し、フォームをクリアしてフォーカスし、ユーザーに手動でログイン情報を入力させる。
JS関数がフィールドをクリアするわずか数ミリ秒前に、Chromeがユーザー名とパスワードを自動的に入力しています。Chromeは変更を適切に取得せず、フィールドが実際には空であっても黄色の塗りつぶされたフィールドが表示されます。
私はオートフォーカス機能に感謝しますが、フォームを自動的にクリアしてほしいと思う十分な理由は考えられません。
悲しいことに、関数はwp-login.php
913-930行(WordPress 4.0)にハードコードされています。wp-login.php
WordPressの今後のアップデートでファイルが上書きされる可能性があるため、ファイルを完全に変更することは悪い考えです。したがって、少し「ハッキング」に頼らなければなりません。
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;
}
上記の修正により、関数が完全に実行されなくなり、適切なオートフォーカスも得られなくなります。それを回避する別の方法があります:Geeklabにob_start
触発されて、HTML出力をバッファリングし、を介してそれを変更します。バッファリングにより、コードの特定の部分(この場合は、オートクリア部分)を削除できます。ただし、バッファをフラッシュすることを忘れないでください。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();
}
私のパスワードは空またはnullだったので、「1234」などの別のパスワードに変更しようとしました。スペースの追加と削除は機能せず、JSを無効にすることもできませんでした。別のブラウザも試したので、それは本当にChromeだけですか?
私がしたことは、データベース内のパスワードハッシュを変更し、それが機能したことです。
wp_users.user_pass
。
私の場合、パスワード1234
はBCryptedです:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC