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

Listagem e Detalhes de Posts WordPress com API REST no Next.js

Listagem de Posts e Roteamento Dinâmico no Next.js

Aprenda a listar e mostrar detalhes de posts do WordPress no Next.js, usando a REST API e App Router, com dicas práticas e código atualizado

Frontend com Next.js - Setup e Integração Inicial com WordPress

Frontend com Next.js: Setup e Integração Inicial

Configure Next.js com TypeScript, Tailwind e App Router, e integre a REST API do WordPress para criar um site headless rápido e moderno

Configurando o WordPress como Backend Headless

Configurando o WordPress como Backend Headless

Aprenda como configurar o WordPress para atuar como backend headless, com REST API, CORS, autenticação e mais

REST API do WordPress

REST API do WordPress: Visão Geral

Descubra como funciona a REST API do WordPress, com estrutura de endpoints, permissões e como integrá-la com React ou Next.js.

Introdução ao WordPress Headless

Introdução ao WordPress Headless

Como Distribuir Seus Blocos Gutenberg em Plugins ou no GitHub

Distribuindo Seus Blocos: Plugins, Repositório e GitHub

Aprenda a empacotar e distribuir seus blocos personalizados como um plugin WordPress completo, pronto para produção, GitHub e WordPress.org

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!