CF7: Validação de CPF/CNPJ

Este snippet adiciona uma validação completa para campos de CPF/CNPJ no Contact Form 7, garantindo que os valores inseridos pelos usuários sejam válidos antes de permitir a submissão do formulário. Isso melhora a integridade dos dados coletados e proporciona uma melhor experiência ao usuário.

0
				
					//Adicionando o JavaScript para Validação no Rodapé
function wp24horas_add_cpf_cnpj_validation_script() {
    ?>
    
        document.addEventListener('DOMContentLoaded', function() {
            document.addEventListener('wpcf7submit', function(event) {
                var cpfCnpjField = document.querySelector('[name="cpf_cnpj"]');
                if (cpfCnpjField && !isValidCpfCnpj(cpfCnpjField.value)) {
                    event.preventDefault();
                    alert('CPF/CNPJ inválido. Por favor, insira um valor válido.');
                }
            });

            function isValidCpfCnpj(value) {
                value = value.replace(/[\D]/g, ''); // Remove caracteres não numéricos
                if (value.length === 11) {
                    return isValidCpf(value);
                } else if (value.length === 14) {
                    return isValidCnpj(value);
                }
                return false;
            }

            function isValidCpf(cpf) {
                if (cpf.length !== 11 || /^(\d)\1{10}$/.test(cpf)) return false;
                var sum, rest;
                sum = 0;
                for (var i = 1; i <= 9; i++) sum += parseInt(cpf.substring(i - 1, i)) * (11 - i);
                rest = (sum * 10) % 11;
                if ((rest === 10) || (rest === 11)) rest = 0;
                if (rest !== parseInt(cpf.substring(9, 10))) return false;
                sum = 0;
                for (var i = 1; i = 1; i--) {
                    sum += numbers.charAt(length - i) * pos--;
                    if (pos < 2) pos = 9;
                }
                var result = sum % 11 = 1; i--) {
                    sum += numbers.charAt(length - i) * pos--;
                    if (pos < 2) pos = 9;
                }
                result = sum % 11 < 2 ? 0 : 11 - sum % 11;
                if (result !== parseInt(digits.charAt(1))) return false;
                return true;
            }
        });
    
     true));
}

function wp24horas_form_tag_cpf_cnpj($tag) {
    $tag = new WPCF7_FormTag($tag);
    $validation_error = wpcf7_get_validation_error($tag->name);
    $class = wpcf7_form_controls_class($tag->type);
    if ($validation_error) {
        $class .= ' wpcf7-not-valid';
    }
    $atts = array();
    $atts['type'] = 'text';
    $atts['name'] = $tag->name;
    $atts['value'] = $tag->get_default_option($tag->values);
    $atts['class'] = $tag->get_class_option($class);
    $atts['id'] = $tag->get_option('id', 'id', true);
    $atts['tabindex'] = $tag->get_option('tabindex', 'int', true);
    $atts['aria-required'] = $tag->is_required() ? 'true' : 'false';
    $atts['aria-invalid'] = $validation_error ? 'true' : 'false';
    return sprintf('<span class="wpcf7-form-control-wrap %1$s">%3$s</span>', sanitize_html_class($tag->name), wpcf7_format_atts($atts), $validation_error);
}


//Adicionando a Validação Personalizada no PHP
add_filter('wpcf7_validate_cpf_cnpj*', 'wp24horas_validate_cpf_cnpj', 20, 2);
add_filter('wpcf7_validate_cpf_cnpj', 'wp24horas_validate_cpf_cnpj', 20, 2);

function wp24horas_validate_cpf_cnpj($result, $tag) {
    $tag = new WPCF7_FormTag($tag);
    $name = $tag->name;
    $value = isset($_POST[$name]) ? trim($_POST[$name]) : '';
    if (!wp24horas_is_valid_cpf_cnpj($value)) {
        $result->invalidate($tag, 'CPF/CNPJ inválido.');
    }
    return $result;
}

function wp24horas_is_valid_cpf_cnpj($value) {
    $value = preg_replace('/[^0-9]/', '', $value);
    if (strlen($value) === 11) {
        return wp24horas_is_valid_cpf($value);
    } elseif (strlen($value) === 14) {
        return wp24horas_is_valid_cnpj($value);
    }
    return false;
}

function wp24horas_is_valid_cpf($cpf) {
    if (strlen($cpf) != 11 || preg_match('/(\d)\1{10}/', $cpf)) {
        return false;
    }
    for ($t = 9; $t < 11; $t++) {
        for ($d = 0, $c = 0; $c < $t; $c++) {
            $d += $cpf[$c] * (($t + 1) - $c);
        }
        $d = ((10 * $d) % 11) % 10;
        if ($cpf[$c] != $d) {
            return false;
        }
    }
    return true;
}

function wp24horas_is_valid_cnpj($cnpj) {
    if (strlen($cnpj) != 14 || preg_match('/(\d)\1{13}/', $cnpj)) {
        return false;
    }
    $t = 12;
    for ($d = 0, $p = 5, $c = 0; $c < $t; $c++) {
        $d += $cnpj[$c] * $p;
        $p = ($p == 2) ? 9 : $p - 1;
    }
    $d = ((10 * $d) % 11) % 10;
    if ($cnpj[$c] != $d) {
        return false;
    }
    $t = 13;
    for ($d = 0, $p = 6, $c = 0; $c < $t; $c++) {
        $d += $cnpj[$c] * $p;
        $p = ($p == 2) ? 9 : $p - 1;
    }
    $d = ((10 * $d) % 11) % 10;
    if ($cnpj[$c] != $d) {
        return false;
    }
    return true;
}

				
			

Quer ajuda de um especialista para implementar?

Instruções de Uso

Explicação do Snippet

  1. Adicionando JavaScript para Validação:
    • O script é adicionado ao rodapé da página.
    • Ele ouve o evento wpcf7submit do Contact Form 7 para verificar o valor do campo CPF/CNPJ antes de enviar o formulário.
    • Se o CPF/CNPJ não for válido, a submissão do formulário é impedida e uma mensagem de erro é exibida.
  2. Adicionando a Tag de Formulário Personalizada:
    • Um novo tipo de campo cpf_cnpj é registrado para ser usado nos formulários do Contact Form 7.
    • O campo é criado com base nas especificações do Contact Form 7 e inclui atributos necessários para a validação.
  3. Adicionando a Validação Personalizada no PHP:
    • As funções de validação para CPF e CNPJ são adicionadas para validar os valores no lado do servidor.
    • Os filtros wpcf7_validate_cpf_cnpj* e wpcf7_validate_cpf_cnpj são usados para aplicar a validação ao campo personalizado.

Instruções de Uso

  1. Adicione o código ao arquivo functions.php do seu tema ou em um plugin específico.
  2. No formulário do Contact Form 7, adicione um campo com o tipo [cpf_cnpj].

Outros Snippets

WooCommerce
Este snippet cria um shortcode que exibe os detalhes de uma reserva do WooCommerce com base no ID do pedido fornecido na URL.
WordPress
Este snippet redireciona todos os visitantes do site que não estejam logados para uma página específica (não a página de login).
WordPress
Este snippet redireciona todos os visitantes do site que não estejam logados para a página de login do WordPress. Isso é útil se você deseja restringir o acesso ao conteúdo do seu site apenas para usuários autenticados.

Últimos Posts

Segurança Profunda em Plugins WordPress

Segurança Profunda em Plugins WordPress

Descubra como aplicar segurança real nos seus plugins WordPress e proteger dados, ações e reputação.

Como Tratar Erros e Exceptions em Plugins WordPress do Jeito Certo

Tratamento de Erros e Uso Inteligente de Exceptions em Plugins WordPress

Aprenda a criar exceções personalizadas, capturar erros com contexto e registrar falhas com elegância em seus plugins WordPress

Como Implementar um Sistema de Logs Profissional em Plugins WordPress

Como Gerenciar Logs e Erros Internos em Plugins WordPress (Do Jeito Certo)

Aprenda a criar um sistema de gerenciamento de erros e logs para plugins WordPress, elevando a qualidade e profissionalismo dos seus projetos

Como Criar um Bloco WordPress com Filtro por Múltiplas Categorias

Bloco de Posts com Filtro por Múltiplas Categorias

Aprenda a criar um bloco Gutenberg com filtro por múltiplas categorias no WordPress. Ideal para projetos profissionais e sites dinâmicos!

Como Filtrar Posts por Categoria em um Bloco Gutenberg

Filtrando Posts por Categoria no Editor do Bloco

Aprenda a criar um bloco personalizado em WordPress que exibe os últimos posts com filtro por categoria. Ideal para projetos dinâmicos com Gutenberg

Como Criar um Bloco Dinâmico no WordPress com Renderização PHP

Bloco Dinâmico com Renderização no Servidor

Aprenda a criar um bloco Gutenberg que carrega posts no editor e renderiza via PHP no frontend. Estrutura profissional com render_callback!

Comentários

Você precisa estar logado para ver esta informação.

Adicione seu Snippet

Título *
Resumo *
Descrição Completa *
Código *
Instruções de uso *

Solicitar Orçamento

Torne-se um Assinante e Eleve seu Conhecimento do WordPress!

Acesso Exclusivo, Suporte Especializado e Muito Mais.

Se você está aproveitando nosso conteúdo gratuito, vai adorar os benefícios exclusivos que oferecemos aos nossos assinantes! 

Não perca a oportunidade de maximizar seu potencial no WordPress. Clique no botão abaixo para se tornar um assinante e leve suas habilidades ao próximo nível!