Manifesto Técnico: A Maldição do Autoload Transiente no banco de dados do WordPress

Manifesto Técnico: A Maldição do Autoload Transiente no banco de dados do WordPress

Eu já vi sites morrerem por causa de um simples ‘SELECT * FROM wp_options WHERE autoload = “yes”‘. Parece inofensivo, né? Mas não é. Em uma manhã de terça-feira, um cliente me liga: ‘O site está lentíssimo, o admin nem carrega mais’. Entro no servidor, top no MySQL, e lá estava: 2,3 GB na tabela wp_options, 95% com autoload ‘yes’. A verdade: transientes expirados, locks de cache, settings de plugins zumbis. O pior: tudo regido pela GPL, então cada plugin faz o que quer. Este manifesto é um grito de guerra contra a negligência com autoload. Prepare-se: vou expor o que a documentação nunca conta.

O Problema: Autoload Transiente Invisível

Transientes no WordPress são como bilhetes post-it: úteis, mas facilmente esquecidos. Quando um plugin define set_transient( 'meu_cache', $dados, 3600 ), ele cria uma entrada em wp_options com autoload = ‘yes’. O problema? Se o cache expirar e o plugin não limpar, o autoload permanece. Multiplique isso por dezenas de plugins, temas, e você tem uma bomba-relógio de banco de dados.

Casos Reais de Estresse

  • WooCommerce + Cache de Produtos: Cada variação de produto gera transientes. Sem uma limpeza adequada, a tabela wp_options incha. Em um site com 10.000 produtos, já vi 500 MB de transientes mortos.
  • Plugins de SEO: Rank Math e Yoast criam transientes para sitemaps. Em sites com muitos posts, o autoload acumula. Um cliente tinha 300 MB de transientes do Yoast, mesmo com o cache reiniciado a cada hora.
  • Redis/Object Cache: Paradoxalmente, plugins de cache podem piorar o autoload. Eles armazenam chaves de cache em wp_options com autoload, e quando o cache externo falha, o banco fica sobrecarregado.

O Diagnóstico

Como identificar o problema? Execute no MySQL:

SELECT option_name, LENGTH(option_value) as bytes, autoload
FROM wp_options
WHERE autoload = 'yes'
ORDER BY bytes DESC
LIMIT 20;

Se vir opções como ‘_transient_*’, ‘_site_transient_*’ ou opções de plugins com mais de 100 KB, você tem um problema. Especialmente perigosos: transientes que nunca expiram (timeout = 0).

Manifesto: Soluções Extremas

  1. Desabilitar Autoload para Transientes: Adicione no wp-config.php:
    define('WP_OPTIONS_AUTOLOAD_TRANSIENTS', false);
    Isso força transientes a serem carregados sob demanda. Cuidado com impacto em performance de cache.
  2. Limpeza Robótica: Use cron jobs diários para deletar transientes expirados:
    DELETE FROM wp_options 
    WHERE option_name LIKE '%_transient_%' 
    AND (option_name LIKE '_transient_timeout_%' 
    AND option_value < UNIX_TIMESTAMP());
  3. Auditoria de Plugins: Todo plugin que usa opções com autoload deve ser revisado. Ferramenta: Query Monitor mostra queries lentas. Se um plugin faz SELECT na wp_options a cada página, denuncie.
  4. Banco de Dados Otimizado: Converta wp_options para InnoDB (se MyISAM) e use índices. Melhora a performance de queries com autoload.

Conclusão (sem dizer conclusão)

Autoload transiente é um assassino silencioso. Ignore por sua conta e risco. A GPL permite que plugins poluam seu banco; cabe a você proteger seu site. Este manifesto é um lembrete: cada byte em wp_options com autoload é uma bala no cano da sua performance. Aja antes que sua página não carregue mais.

"O banco de dados é o coração do WordPress. Autoload transiente é a artéria entupida."

Rolar para cima