LGPD

Apagar dados do cliente no WooCommerce sem perder o histórico do pedido

Chega o pedido de exclusão pela LGPD e você trava: apagar o pedido derruba o histórico que a contabilidade precisa manter por anos. Os dois não brigam. A lei fala em eliminar dado pessoal, a obrigação fiscal fala em guardar a operação. O caminho é anonimizar o pedido: itens, valores e datas ficam; nome, e-mail, endereço e IP viram lixo.

Um pedido específico, agora

sudo -u www-data wp eval 'WC_Privacy_Erasers::remove_order_personal_data( wc_get_order( 4821 ) );'

É o mesmo método que a ação em massa do admin chama. Ele troca os campos de faturamento e entrega por texto genérico, zera o IP e o user agent, apaga as notas do pedido e registra uma nota “Personal data removed.”. O total e os produtos continuam lá para o relatório fechar. A classe só é incluída no init, então isso roda liso no wp eval, mas quebra com “Class not found” se você chamar durante o carregamento de um plugin.

Automatize pelo painel e trate o CPF

Em WooCommerce > Configurações > Contas e privacidade, na seção de retenção de dados pessoais, o campo “Reter pedidos concluídos” recebe um número e uma unidade (meses, normalmente). A partir daí o WooCommerce anonimiza sozinho, numa rotina diária agendada no Action Scheduler.

O que ele não sabe limpar é o campo que o plugin de checkout brasileiro criou. Ganche no hook e apague o seu meta junto:

add_action( 'woocommerce_privacy_remove_order_personal_data', function ( $order ) {
    foreach ( array( '_billing_cpf', '_billing_birthdate', '_billing_number' ) as $meta ) {
        $order->delete_meta_data( $meta );
    }
    $order->save();
} );

Esse hook dispara depois que o core já deu o save() dele, por isso o $order->save() no fim do callback não é enfeite: sem ele o meta volta. Antes de rodar em lote, faça o dump do banco e teste num pedido de homologação — o cliente perde o acesso a esse pedido na conta dele e não existe desfazer.

Post Recentes

WP_MEMORY_LIMIT no WordPress: resolver memória esgotada no PHP 8.3

Allowed memory size exhausted no painel: qual das duas constantes do wp-config.php mexer, onde conferir o valor real e por…

8 horas atrás

Converter data dd/mm/aaaa para o MySQL com DateTime::createFromFormat

strtotime com data brasileira devolve false e o INSERT quebra no MySQL 8. Use createFromFormat com getLastErrors antes de mandar…

2 dias atrás

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,…

3 dias 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…

4 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…

5 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…

5 dias atrás