PHP 8

Creation of dynamic property: deprecated no PHP 8.3 com WordPress 6.9

Um debug.log de vários gigabytes e todas as linhas iguais: PHP Deprecated: Creation of dynamic property Meu_Widget::$config is deprecated. O aviso nasceu no PHP 8.2 e continua firme no 8.3: alguém atribui uma propriedade que a classe nunca declarou. Primeiro descubra o arquivo, depois decida entre corrigir e calar.

Isolar quem está reclamando

cd /var/www/rogertakemiya.com.br/html/wp-content
grep -o 'Creation of dynamic property [^ ]*' debug.log | sort | uniq -c | sort -rn | head
grep 'dynamic property' debug.log | grep -o 'in /var/www[^ ]*' | sort -u

A primeira linha mostra quais classes repetem mais, a segunda entrega o caminho exato do arquivo. Se cair em tema ou plugin que você mantém, a correção é declarar a propriedade e acabou:

class Meu_Widget {
    public array $config = [];   // antes era criada no voo

    public function __construct() {
        $this->config['modo'] = 'lista';
    }
}

Para código de terceiro que você não vai manter, existe o atributo #[AllowDynamicProperties] em cima da classe. É o mesmo recurso que o core do WordPress usa em dezenas de classes próprias, como WP_Block_Type. Só que a próxima atualização do plugin apaga a sua alteração, então trate isso como remendo de emergência.

Calar sem perder erro de verdade

Botar error_reporting() no wp-config.php não adianta: o WordPress roda wp_debug_mode() logo no começo do wp-settings.php e reescreve tudo para E_ALL quando WP_DEBUG está ligado. Os mu-plugins carregam bem depois disso, e é ali que a mudança sobrevive:

// wp-content/mu-plugins/sem-deprecated.php
error_reporting( E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED );

Aviso disparado antes dos mu-plugins ainda entra no log, então isso corta a enxurrada, não tudo. Mantenha WP_DEBUG_LOG ligado e WP_DEBUG_DISPLAY em false, para nada vazar na tela do cliente. Depois trunque o arquivo antigo com truncate -s 0 debug.log, porque apagar com o PHP escrevendo nele deixa o inode ocupado e o disco não volta.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

Plugin do Magento 2 não executa: método final, private ou objeto novo

O before ou around declarado no di.xml nunca dispara. Confira o Interceptor em generated e descarte as três causas que…

8 horas atrás

Criar swapfile no Ubuntu: parar o OOM killer de matar o MySQL

VPS de 2 GB onde o mysqld morre de madrugada e o site volta com erro de conexão. Como confirmar…

2 dias atrás

Grupos nomeados no preg_match: pare de contar índice de $matches

Regex com cinco parênteses e ninguém lembra se a data é $matches[2] ou $matches[3]. Nomeie os grupos e leia o…

3 dias atrás

Token de integração da API do Magento 2: gerar e usar no header Bearer

Erro The consumer isn't authorized to access resources ao chamar a REST do Magento 2.4.8? Ative a integração, libere os…

3 dias atrás

Rate limit no wp-login.php com nginx: barrar força bruta antes do PHP

Bots batendo centenas de POST por minuto no login derrubam a CPU. Configure limit_req_zone no nginx e devolva 429 antes…

4 dias atrás

Anonimizar IP no nginx: mascarar o último octeto do log para a LGPD

Seu access.log guarda o IP inteiro dos visitantes há meses sem necessidade. Mascare o último octeto com map e log_format…

5 dias atrás