Как отключить автозаполнение на странице wp-login.php
Похоже, нет простого способа добавить атрибут autocomplete="off" к полю ввода пароля на странице входа WordPress без прямого редактирования файла wp-login.php.
Может я что-то упускаю? Я не хочу изменять основные файлы системы.
Ваше единственное решение (без изменения основных файлов) — использовать JavaScript.
function wpse_159462_login_form() {
echo <<<html
<script>
document.getElementById( "user_pass" ).autocomplete = "off";
</script>
html;
}
add_action( 'login_form', 'wpse_159462_login_form' );
Тем не менее, если вы не единственный, кто будет входить в систему, я не рекомендую отключать автозаполнение — это почти наверняка разозлит людей.
Если кому-то интересно, вот решение, которое сработало у меня
if ( $GLOBALS['pagenow'] === 'wp-login.php' ) {
ob_start();
}
add_action('login_form', function($args) {
$login = ob_get_contents();
ob_clean();
$login = str_replace('id="user_pass"', 'id="user_pass" autocomplete="off"', $login);
$login = str_replace('id="user_login"', 'id="user_login" autocomplete="off"', $login);
echo $login;
}, 9999);
Вот решение, которое я придумал, используя только PHP:
function disable_autofill_password($safe_text, $text) {
if($safe_text === 'user_pass') {
$safe_text .= '" autocomplete="new-password';
}
return $safe_text;
}
add_filter('attribute_escape', 'disable_autofill_password', 10, 2);
Это небольшой хак для фильтра esc_attr. Он закрывает атрибут id поля ввода пароля, а затем добавляет атрибут autocomplete (значение new-password используется для Chrome).
Кто-то уже создал плагин для этого. Он не представлен в официальном каталоге WordPress, но довольно прост и отлично работает. Хорошая практика — изучить исходный код, если вы сомневаетесь в плагинах, не указанных в каталоге WP. Я проверил его, и там нет ничего подозрительного.
Посмотреть код можно здесь: https://www.buzelac.com/2014/10/disabling-wordpress-login-password-autocomplete/
Или скачать плагин здесь: https://www.buzelac.com/wp-content/uploads/2015/05/disable-login-autocomplete.zip
В нём нет ничего сложного — он просто заменяет 'id="user_pass"' на 'id="user_pass" autocomplete="off"' при генерации формы входа:
$content = str_replace('id="user_pass"', 'id="user_pass" autocomplete="off"', $content);
Попробуйте буферизацию вывода в PHP:
add_action('login_header', function () {
ob_start();
});
add_action('login_footer', function () {
$content = ob_get_clean();
$content = str_replace(' name="log"', ' name="log" autocomplete="off"', $content);
$content = str_replace(' name="pwd"', ' name="pwd" autocomplete="off"', $content);
echo $content;
});