
Caiu um e-mail pedindo “todos os meus dados” e o relógio da LGPD começou a correr. O WordPress tem isso pronto desde a 4.9.6: vá em Ferramentas > Exportar dados pessoais, digite o e-mail do titular e envie o pedido. Depois que ele confirma pelo link, você clica em Baixar dados pessoais e o núcleo gera um ZIP em wp-content/uploads/wp-personal-data-exports/.
O problema é que esse ZIP sai pela metade: o núcleo exporta o perfil, os comentários e os anexos de mídia, e nada do que o seu plugin ou o WooCommerce guardaram em tabela própria ou em user meta entra.
add_filter('wp_privacy_personal_data_exporters', function (array $exporters): array {
$exporters['minha-newsletter'] = [
'exporter_friendly_name' => 'Newsletter da loja',
'callback' => 'rt_exportar_newsletter',
];
return $exporters;
});
function rt_exportar_newsletter(string $email, int $page = 1): array {
global $wpdb;
$linha = $wpdb->get_row($wpdb->prepare(
"SELECT origem, criado_em FROM {$wpdb->prefix}newsletter WHERE email = %s",
$email
), ARRAY_A);
$data = [];
if ($linha) {
$data[] = [
'group_id' => 'newsletter',
'group_label' => 'Newsletter',
'item_id' => 'newsletter-' . md5($email),
'data' => [
['name' => 'Origem do cadastro', 'value' => $linha['origem']],
['name' => 'Data do aceite', 'value' => $linha['criado_em']],
],
];
}
return ['data' => $data, 'done' => true];
} A chave done é obrigatória. Com milhares de linhas, devolva um lote por chamada usando o $page e só mande done => true no último; devolver false pra sempre trava o admin em loop.
E saiba onde o arquivo mora: uploads é público, então o ZIP fica acessível por URL pra quem souber o endereço, e a única barreira é o hash aleatório no nome. Um cron horário apaga os exports com mais de três dias, prazo que o filtro wp_privacy_export_expiration muda. Não copie o ZIP pra outra pasta.
Os pedidos ficam no post type user_request, com status request-pending até o titular confirmar. Se a confirmação não chega, o problema é entrega de e-mail, não o exportador: teste com sudo -u www-data wp eval "var_dump(wp_mail('voce@dominio.com','teste','ok'));".
A função json_validate do PHP 8.3 diz se a string é JSON válido sem montar array nem objeto. Serve para…
Tire a chave de API do código com variável de ambiente, bloqueie o .env no nginx e entenda por que…
A opção de armazenamento de pedidos travada em posts e a sincronização que nunca termina: como migrar para as tabelas…
Troque strpos e substr por str_contains, str_starts_with e str_ends_with no PHP 8, com o polyfill para quem ainda mantém servidor…
Copiou um InstallData.php de tutorial antigo e o atributo não apareceu depois do setup:upgrade? Veja a classe de Data Patch…
Função pronta para gerar um cupom único por cliente depois do pedido concluído, com WC_Coupon, data de expiração, limite de…