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

Aprimoramento de Performance no WordPress: Otimização de Scripts e CSS

Aprimoramento de Performance no WordPress: Otimização de Scripts e CSS

Descubra como otimizar scripts e CSS no WordPress para melhorar a performance do seu site. Aprenda técnicas de minificação, lazy loading, cache e muito mais.

Como Criar e Estruturar Child Themes Profissionais no WordPress

Como Criar e Estruturar Child Themes Profissionais no WordPress

Aprenda como criar e estruturar child themes profissionais no WordPress. Personalize temas com segurança, adicione funcionalidades e garanta que suas alterações permaneçam intactas em atualizações.

Como Estilizar Temas WordPress com CSS Avançado e Sass

Como Estilizar Temas WordPress com CSS Avançado e Sass

Aprenda como estilizar temas WordPress com CSS avançado e Sass. Descubra como usar variáveis, aninhamento e mixins para criar estilos organizados e responsivos.

Como Criar Templates Personalizados no WordPress

Aprenda como criar templates personalizados no WordPress com este guia completo. Descubra como personalizar layouts, usar WP_Query e carregar scripts específicos.

Como Criar um Tema WordPress Simples do Zero

Como Criar um Tema WordPress Simples do Zero

Aprenda como estruturar um tema básico no WordPress e entenda os arquivos principais e os templates comuns necessários

Anatomia de um Tema Avançado no WordPress

Anatomia de um Tema Avançado no WordPress

Conheça estrutura de um tema avançado, com foco nos arquivos essenciais e na hierarquia de templates, usando o Twenty Twenty-Three como exemplo

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!