Erro "O campo senha está vazio" ao usar o preenchimento automático no Chrome

10

Quando abro a tela de login no Chrome, o navegador preenche automaticamente o formulário com meu nome de usuário e senha. No entanto, quando clico no botão Enviar, recebo a seguinte mensagem:

ERRO: O campo da senha está vazio.

Adicionar um espaço à senha preenchida automaticamente e removê-la novamente me permite fazer login. O que está acontecendo?

Robbert
fonte

Respostas:

15

A função JavaScript wp_attempt_focusestá causando esse problema. A função é acionada logo após o carregamento da página, limpa o formulário e se concentra nele, forçando os usuários a inserir manualmente suas informações de login.

O Chrome está preenchendo o nome de usuário e a senha automaticamente, apenas milissegundos antes que a função JS limpe o campo. O Chrome não capta corretamente as alterações, exibindo campos preenchidos em amarelo, mesmo que os campos estejam realmente vazios.

Embora eu aprecie a funcionalidade de foco automático, não consigo pensar em um bom motivo para alguém querer que o formulário seja limpo automaticamente.

A fonte

Infelizmente, a função foi codificada wp-login.phpnas linhas 913-930 (WordPress 4.0). Alterar o wp-login.phparquivo por completo é uma má ideia, pois pode ser substituída em qualquer atualização futura do WordPress. Então, teremos que recorrer a um pouco de 'hackers'.

A solução fácil

A wp_attempt_focusfunção é chamada se o formulário não tiver erros. Estamos com sorte - a verificação de erros é feita via PHP. Isso significa que podemos simplesmente impedir que a função seja disparada fingindo um erro de formulário no momento certo usando ações do WP. Eu escolhi a login_formação, pois ela sempre é acionada após o tratamento de erros, logo antes da chamada do JS. Adicione o seguinte código ao seu tema functions.php(ou arquivo de plug-in):

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

A correção hackish

A correção acima impede que a função seja disparada completamente, o que significa que você também não obterá o foco automático adequado. Existe outra maneira de contornar isso: armazenar em buffer a saída HTML e modificá-la via ob_start, como inspirado no Geeklab . O buffer permite remover partes específicas do código - nesse caso, a parte autoclear d.value = ''. Não se esqueça de liberar o buffer.

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();
}
Robbert
fonte
2
Excepcional. Uma correção para isso deve ser aplicada ao núcleo. Recebi muitos comentários de usuários que têm problemas com isso. Obrigado por compartilhar a correção.
Christine Cooper
Obrigado pela solução. Também pense que isso não deveria estar no centro.
ThiagoPonte
0

Eu tive esse problema também. Desligou o plug-in "WP-SpamShield" de Scott Allen e tudo começou a funcionar novamente.

ERM
fonte
0

Minha senha estava vazia / nula, então tentei alterá-la para outra coisa, como "1234". Adicionar o espaço e removê-lo não funcionou nem desabilitou o JS. Também tentei um navegador diferente, então é realmente apenas no Chrome?

O que fiz foi alterar o hash da senha no banco de dados e funcionou. wp_users.user_pass.

no meu caso, a senha 1234é como BCrypted:$2a$06$x4lljZOw0Cfuj7jy6qsdp./iX34gaDUMXQIQob4VIHLXQ5yI92RjC

http://bcrypthashgenerator.apphb.com/?PlainText=1234

imagem

P_95
fonte