Cookies

Banner de cookie que bloqueia de verdade: script só carrega depois do aceite

Abra sua home numa janela anônima, não clique em nada do banner e olhe a aba Application do DevTools. Se o _ga já está lá, seu banner é decoração: ele informa, mas não bloqueia. A tag do Analytics carregou junto com o resto da página, muito antes de alguém consentir.

O truque pra segurar é velho e continua sendo o mais confiável: o navegador não executa uma tag de script cujo type ele não reconhece. Você troca o src por data-src, marca como text/plain e o arquivo nem chega a ser baixado.

<script type="text/plain" data-cookie="analytics"
        data-src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>

A troca no clique do aceite

function liberarCookies(categoria) {
  var seletor = 'script[type="text/plain"][data-cookie="' + categoria + '"]';

  document.querySelectorAll(seletor).forEach(function (velho) {
    var novo = document.createElement('script');
    novo.async = true;
    if (velho.dataset.src) {
      novo.src = velho.dataset.src;
    } else {
      novo.textContent = velho.textContent;
    }
    velho.parentNode.replaceChild(novo, velho);
  });
}

var btn = document.getElementById('aceitar');
if (btn) {
  btn.addEventListener('click', function () {
    localStorage.setItem('consentimento', 'analytics');
    liberarCookies('analytics');
  });
}

if (localStorage.getItem('consentimento') === 'analytics') {
  liberarCookies('analytics');
}

Trocar o elemento inteiro é obrigatório. Se você só mudar o atributo type de uma tag que já está no DOM, o navegador ignora: a decisão de executar acontece no momento da inserção, e não tem volta.

Onde isso vaza

Bloquear a tag externa não basta se o bloco de configuração inline continuar rodando, então ele também vira text/plain (sem data-src, o script reaproveita o textContent). Vídeo do YouTube grava do lado dele, pelo iframe: nem o domínio youtube-nocookie zera isso, e a saída ali é uma miniatura clicável enquanto não houver aceite.

Falta o outro lado: recusar tem que ser tão fácil quanto aceitar, e o botão de recusa só grava negado no mesmo item, sem injetar nada. Depois de mexer, repita o teste da janela anônima. Nenhum cookie de terceiro antes do clique, todos depois: esse é o único resultado que vale.

Post Recentes

Erro 500 no Magento 2: achar o relatório em var/report pelo ID da tela

O hash que o Magento mostra junto do erro é o nome de um arquivo em var/report. Veja como abrir,…

24 horas atrás

Campo extra no checkout em blocos do WooCommerce sem voltar pro shortcode

Seu snippet com woocommerce_checkout_fields parou de aparecer no checkout em blocos. Registre o campo pela API nova e leia o…

2 dias atrás

Fuso horário no PHP 8.3: log com 3 horas de diferença no servidor

O pedido entrou às 21h e o relatório mostra 00h do dia seguinte. Onde setar date.timezone no PHP 8.3 e…

3 dias atrás

Magento 2 não envia e-mail de pedido: async sending e cron parado

O pedido entra na loja e o e-mail nunca sai: antes de culpar o SMTP, veja o envio assíncrono, a…

3 dias atrás

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

4 dias atrás

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

4 dias atrás