post #6103
Validar e-mail corporativo com PHP no formulário do Elementor
Publicado em: 06/03/2025 / Atualizado em: 27/08/2025
Se você precisa adicionar um formulário no seu site WordPress que utiliza o constructor de temas Elementor, mas precisa adicionar uma validação personalizada no campo de email para que o seu usuário apenas adicione emails corporativos e não adicione emails de domínios de contas gratuitas, como Hotmail, Gmail, Yahoo, iCloud, entre outros.
Então você pode utilizar um recurso nativo do Elementor que é o PHP Hooks e adicionar uma função em PHP personalizada através do plugin WP Code ou do arquivo Functions.php.
Código de validação
Segue abaixo o trecho do código em PHP para que você consiga colocar dentro do WP Code ou do arquivo Functions.php do seu site:
function elementor_form_validation( $record, $ajax_handler ) {
//$form_name = $record->get_form_settings( 'form_name' );
//if ( $form_name !== 'Nome do formulário especifico' ) {
// return;
//}
$fields = $record->get_field( [
'id' => 'email',
] );
if ( empty( $fields ) ) {
return;
}
$field = current( $fields );
$email = $field['value'];
// Lista de domínios bloqueados
$dominios_bloqueados = [
'hotmail.com',
'gmail.com',
'yahoo.com',
'uol.com.br',
'terra.com.br',
'icloud.com',
'outlook.com',
'live.com'
];
// Extrai o domínio do e-mail
$email_parts = explode('@', $email);
$dominio_email = isset($email_parts[1]) ? strtolower($email_parts[1]) : '';
// Verifica se o domínio está na lista de bloqueio
if (in_array($dominio_email, $dominios_bloqueados)) {
$ajax_handler->add_error(
$field['id'],
esc_html__( 'E-mails de domínio público não são permitidos. Use um e-mail corporativo.', 'textdomain' )
);
}
}
add_action( 'elementor_pro/forms/validation', 'elementor_form_validation', 10, 2 );OBS: Se você quiser restringir para apenas 1 formulário especifico, você pode descomentar as primeiras linhas do código, que servem para restringir para um formulário.
Modo avançado
Caso precise de um código mais avançado, onde precise aplicar mais regras para bloquear e-mails indesejados, como de extensão de domínios, ou nomes específicos, você pode melhorar o código como mostra abaixo:
function elementor_form_validation_geral( $record, $ajax_handler ) {
$fields = $record->get_field( [
'id' => 'email', // ID do campo E-mail
] );
if ( empty( $fields ) ) {
return;
}
$field = current( $fields );
$email = $field['value'];
// Extrai o domínio do e-mail
$email_parts = explode('@', $email);
$dominio_email = isset($email_parts[1]) ? strtolower($email_parts[1]) : '';
// === Listas de bloqueio ===
$dominios_bloqueados_exatos = [
'exemplo.com',
'dominio.com'
];
$sufixos_bloqueados = [
'.ru',
'.online',
'.xyz'
];
$palavras_bloqueadas = [
'teste',
'malware',
'phish'
];
// === Verificação única baseada nas listas ===
$sufixo_bloqueado = false;
foreach ( $sufixos_bloqueados as $sufixo ) {
if ( str_ends_with( $dominio_email, $sufixo ) ) {
$sufixo_bloqueado = true;
break;
}
}
$palavra_bloqueada = false;
foreach ( $palavras_bloqueadas as $palavra ) {
if ( stripos( $dominio_email, $palavra ) !== false ) {
$palavra_bloqueada = true;
break;
}
}
if (
in_array( $dominio_email, $dominios_bloqueados_exatos ) ||
$sufixo_bloqueado ||
$palavra_bloqueada
) {
$ajax_handler->add_error(
$field['id'],
esc_html__( 'Por favor insira um e-mail válido.', 'textdomain' )
);
}
}
add_action( 'elementor_pro/forms/validation', 'elementor_form_validation_geral', 10, 2 );Validação no Frontend com JS
Mesmo com a validação em PHP, que vai rodar no backend, trazendo mais segurança para sua validação, as vezes você quer uma validação visual rápida para o usuário no frontend antes dele enviar o formulário e esperar a mensagem de erro.
Para isso, vou deixar um código em JS para usar em conjunto com o script PHP acima. Esse código vai fazer a mesma coisa que o script PHP, mas vai rodar no frontend, e vai exibir uma mensagem imediatamente assim que o usuário digitar no campo e-mail.
<script>
document.addEventListener('DOMContentLoaded', function () {
const emailInput = document.getElementById('form-field-email');
if (!emailInput) return;
const dominiosBloqueados = [
'exemplo.com',
'dominio.com',
'hotmail.com',
'gmail.com',
'yahoo.com',
'uol.com.br',
'terra.com.br',
'icloud.com',
'outlook.com',
'live.com'
];
const sufixosBloqueados = [
'.ru',
'.online',
'.xyz'
];
const palavrasBloqueadas = [
'teste',
'malware',
'phish'
];
// Mensagem de erro
const errorMsg = document.createElement('div');
errorMsg.style.color = 'red';
errorMsg.style.fontSize = '18px';
errorMsg.style.marginTop = '5px';
errorMsg.style.display = 'none';
errorMsg.textContent = 'ATENÇÃO: E-mails de domínio público não são permitidos. Use um e-mail corporativo.';
emailInput.parentNode.appendChild(errorMsg);
function isEmailBloqueado(email) {
if (!email.includes('@')) return false;
const domain = email.split('@')[1].toLowerCase();
// Domínio exato bloqueado
if (dominiosBloqueados.includes(domain)) return true;
// Sufixo bloqueado
for (let sufixo of sufixosBloqueados) {
if (domain.endsWith(sufixo)) return true;
}
// Palavra bloqueada
for (let palavra of palavrasBloqueadas) {
if (domain.includes(palavra)) return true;
}
return false;
}
emailInput.addEventListener('input', function () {
const value = emailInput.value.trim();
if (isEmailBloqueado(value)) {
errorMsg.style.display = 'block';
} else {
errorMsg.style.display = 'none';
}
});
// Bloquear envio do formulário (Elementor)
const form = emailInput.closest('form');
if (form) {
form.addEventListener('submit', function (e) {
if (isEmailBloqueado(emailInput.value.trim())) {
e.preventDefault();
errorMsg.style.display = 'block';
emailInput.focus();
}
});
}
});
</script>OBS: O ideal é sempre ter um código de backend e frontend rodando juntos, e não somente deixar a validação para o frontend, pois isso é uma brecha de segurança. Códigos de backend pode ser manipulados, eles servem apenas para trazer uma experiencia para o usuário, mas não para segurança. Já os códigos de backend são mais complexos para serem manipulados, visto que não são inspecionais pelo navegador nem alterados.
Publicações recomendadas:
Link Direto
Compartilhe esse conteudo nas redes sociais ou por mensagem usando o link direto abaixo. Basta copiar.
bruno.art.br/?p=6103
ID de Referência: 6103
Sugira uma publicação
Envie uma mensagem e sugira um publicação sobre um assunto que tenha dificuldades de resolver.