Validar e-mail corporativo com PHP no formulário do Elementor - Bruno Devx - BR Criativus

post #6103

Validar e-mail corporativo com PHP no formulário do Elementor

Publicado em: 06/03/2025 / Atualizado em: 27/08/2025

Categorias: BlogElementorPHPWordpressWPCode

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.

Clique aqui e entre em contato