Dica de PHP · publicada em
strpos devolve a posição da ocorrência, e a posição zero é um valor válido — mas 0 é falso em contexto booleano. Por isso a comparação obrigatória com !== false, que todo mundo esquece de vez em quando.
As três funções do PHP 8 resolvem isso devolvendo booleano de verdade: str_contains, str_starts_with e str_ends_with. O código fica mais curto e o bug some.
Em plugin WordPress isso aparece muito ao inspecionar URL, nome de arquivo ou hook. Se você ainda precisa suportar PHP 7, declare as funções num polyfill condicional — mas hoje a maioria dos sites já está em 8.
// antes: o !== false e obrigatorio e facil de esquecer
if (strpos($url, '/wp-admin/') !== false) { ... }
// depois
if (str_contains($url, '/wp-admin/')) { ... }
if (str_starts_with($hook, 'woocommerce_')) { ... }
if (str_ends_with($arquivo, '.php')) { ... }
Na prática: troca strpos(...) !== false por str_contains(). Some o bug do índice zero.