# Como corrigir Undefined array key no PHP 8 do WordPress

O Undefined array key é um aviso do PHP 8 que aparece quando o código tenta ler uma posição de um array que não existe, por exemplo um campo de formulário que não foi enviado. O site segue no ar, mas a mensagem aparece na tela ou enche o debug.log e indica que falta uma verificação no código.

## O que é o aviso Undefined array key no PHP 8?

O Undefined array key no PHP 8 do WordPress é o aviso emitido quando o código acessa uma chave de array inexistente, como $_POST['campo'] sem que o campo tenha sido enviado, ou $opções['cor'] sem que essa opção exista no array. No PHP 7 isso gerava um notice mais discreto; no PHP 8.0 ele virou um Warning, mais visível. Não é fatal, então a página continua carregando, mas o aviso aparece e sinaliza que falta uma checagem de existência (isset ou null coalescing) antes de ler a chave.

## Como identificar

- Mensagem "Warning: Undefined array key "nome_da_chave" in /caminho/arquivo.php on line N", citando a chave, o arquivo e a linha.
- Variações com chave numérica, como "Warning: Undefined array key 0", quando o código espera um item de array que não veio.
- Os avisos enchem o wp-content/debug.log e podem aparecer no topo de páginas, em formulários ou em telas de configuração de plugins.
- O problema apareceu logo após o host atualizar a versão do PHP do plano para 8.0 ou superior.

**Antes de começar:** Faça backup do arquivo antes de editar e nunca remenda o arquivo de um plugin de terceiros direto: a alteração some na próxima atualização. Desligar WP_DEBUG_DISPLAY apenas oculta o aviso do visitante; a correção real é a checagem da chave ou a atualização do plugin.

## Como prevenir

- Sempre cheque chaves de $_POST, $_GET e de opções com isset() ou ?? antes de lê-las
- Mantenha plugins, tema e o core atualizados para versões compatíveis com o PHP 8
- Em produção, deixe WP_DEBUG_DISPLAY como false e acompanhe o debug.log

Erros relacionados

- [Como corrigir avisos de Deprecated no PHP 8](https://full.services/wp-fixer/corrigir-deprecated-php8-wordpress/)
- [Como atualizar a versão do PHP com segurança](https://full.services/wp-fixer/atualizar-versao-php-wordpress/)
- [Como corrigir Call to undefined function](https://full.services/wp-fixer/corrigir-call-to-undefined-function-wordpress/)

## Causa

- Leitura de $_POST, $_GET ou $_REQUEST com uma chave que nem sempre é enviada (campo de formulário opcional ou ausente).
- Acesso a uma opção de plugin ou tema antes de ela existir no array salvo, comum na primeira execução após instalar.
- Plugin ou tema escrito para o PHP 7 que lia chaves inexistentes sem checar, o que só virou Warning no PHP 8.
- Resultado de uma função (como wp_parse_args ou shortcode_atts) acessado por uma chave que o array retornado não contém.
- WP_DEBUG e WP_DEBUG_DISPLAY ligados em produção, expondo os avisos ao visitante na tela.

## Como resolver

1. Localize a chave e o arquivo no aviso: a mensagem cita a chave entre aspas, o arquivo e a linha. Isso aponta exatamente qual acesso ao array está sem verificação.
2. Atualize o plugin ou o tema responsável: se o arquivo citado é de um plugin ou tema, atualize-o. As versões compatíveis com o PHP 8 já protegem esses acessos a array.
3. Proteja o acesso com isset ou coalescência nula: em código próprio, verifique a chave antes de ler, usando isset() ou o operador de coalescência nula com um valor padrão.
4. Esconda os avisos do visitante em produção: no wp-config.php, registre os avisos no log mas não os exiba na tela enquanto corrige:

```
define('WP_DEBUG', true);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', true);
```

5. Revise o debug.log após corrigir: depois de atualizar plugins e ajustar o código, confira o debug.log para confirmar que os avisos Undefined array key pararam de surgir.

## Código

```php
// ANTES (dispara Warning: Undefined array key quando o campo nao vem):
$cidade = $_POST['cidade'];

// DEPOIS, opcao 1 — coalescencia nula com valor padrao:
$cidade = $_POST['cidade'] ?? '';

// DEPOIS, opcao 2 — checagem explicita antes de usar:
if ( isset( $_POST['cidade'] ) ) {
    $cidade = sanitize_text_field( wp_unslash( $_POST['cidade'] ) );
} else {
    $cidade = '';
}
```

## Perguntas frequentes

### Undefined array key derruba o site?

Não. É um Warning, não um erro fatal: a página continua carregando. O incômodo é o aviso aparecer na tela ou encher o debug.log, sinalizando que falta uma checagem antes de ler aquela chave do array.

### Por que esse aviso só apareceu depois de atualizar o PHP?

No PHP 7 acessar uma chave inexistente gerava um notice discreto. No PHP 8.0 isso passou a ser um Warning, mais visível. O código não mudou; a versão do PHP que o avalia ficou mais rígida.

### Qual a diferença entre isset e o operador de coalescência nula?

isset() retorna verdadeiro ou falso para você decidir o que fazer; o operador ?? já devolve o valor da chave ou um padrão quando ela não existe. Para apenas definir um valor seguro, o ?? é mais curto; para lógica condicional, use isset().

### O aviso vem de um plugin. Como corrijo?

Atualize o plugin: as versões feitas para o PHP 8 já protegem esses acessos. Não edite o arquivo do plugin diretamente, porque a alteração é perdida na próxima atualização. Se ele não recebe updates, considere substituí-lo.

### Esconder o aviso com WP_DEBUG_DISPLAY resolve de vez?

Não resolve, só oculta o aviso do visitante. O acesso inseguro à chave continua no código. Use essa configuração como medida temporária em produção enquanto atualiza plugins e corrige os snippets próprios.

### Esse aviso pode indicar um bug de verdade?

Pode. Às vezes a chave deveria existir e está ausente por causa de um erro de lógica: um campo que não foi salvo, um índice errado. Vale checar se o valor esperado realmente deveria estar ali antes de só silenciar o aviso.

**Fonte:** [PHP Manual — Arrays (Accessing array elements)](https://www.php.net/manual/en/language.types.array.php)
