Blog

♻️ Maximizando a compatibilidade PHP para WordPress 6.4 e o diretório de plugins

Leonardo Losoviz
Por Leonardo Losoviz ·

WordPress 6.4 "Shirley" foi lançado. É recomendado executá-lo com PHP 8.1 ou 8.2, mas a versão mínima de PHP suportada ainda é a 7.0.

Portanto, nossos plugins WordPress precisam (tanto quanto possível) suportar PHP até a versão 7.0 e ser compatíveis com PHP 8.1 e 8.2.

A maneira mais lógica de fazer isso é programar nossos plugins usando PHP 7.0, evitando:

  • Usar funcionalidades que foram depreciadas no PHP 7.x, pois essas terão sido removidas no PHP 8.x
  • Usar funcionalidades que foram depreciadas no PHP 8.x, pois essas gerarão avisos

Para ter certeza de que o código do plugin é compatível, precisamos testá-lo detalhadamente em vários ambientes, executando as diferentes versões do PHP.

Programar em PHP 7.x tem uma desvantagem clara: o código do plugin precisa ser compatível com PHP 8.x, mas não pode usar nenhuma de suas funcionalidades, como union types, a expressão match, o operador nullsafe e muitas outras.

Existe uma alternativa melhor.

Fazendo o downgrade do código PHP de 8.x para 7.x

Em vez de programar em PHP 7 e garantir que funcione com PHP 8, podemos fazer o inverso: programar o plugin em PHP 8 e fazer o downgrade para PHP 7.

Isso é possível graças ao Rector, uma ferramenta para automatizar o refactoring de código PHP.

O Rector fornece regras para fazer o downgrade do código de PHP 8.1 para PHP 7.2. Isso significa que podemos usar essas funcionalidades modernas em nossos plugins WordPress, pois elas podem ser convertidas em código PHP 7.2.

Por exemplo, a regra DowngradeMatchToSwitchRector converte o operador match em um operador switch:

class SomeClass
{
    public function run()
    {
-        $message = match ($statusCode) {
-            200, 300 => null,
-            400 => 'not found',
-            default => 'unknown status code',
-        };
+        switch ($statusCode) {
+            case 200:
+            case 300:
+                $message = null;
+                break;
+            case 400:
+                $message = 'not found';
+                break;
+            default:
+                $message = 'unknown status code';
+                break;
+        }
    }
}

Note que as regras servem apenas para fazer o downgrade até PHP 7.2, não até PHP 7.1 e 7.0. No entanto, isso não é um grande problema, pois essas duas versões de PHP combinadas representam apenas 3% dos sites WordPress.

Fazer o downgrade do código é uma abordagem melhor, porque:

  • Ao programar em PHP 8.1, temos absoluta certeza de que nosso código será compatível com PHP 8.1 e 8.2.
  • Desde que usemos funcionalidades PHP para as quais existem regras de downgrade, o código também funcionará no PHP 7.2, 7.3 e 7.4.
  • Podemos usar as funcionalidades do PHP 8.x, como union types, a expressão match, o operador nullsafe e muitas outras.

Note que nem todas as funcionalidades do PHP 8.x estão disponíveis. Por exemplo, não existe (ainda) uma regra para fazer o downgrade de enumerações, portanto não podemos usá-las.

Quanto aos testes, não há diferença: também precisamos testar detalhadamente o plugin em vários ambientes, executando as diferentes versões de PHP, para estar seguros.

Como fazer o downgrade do código

Gato GraphQL é desenvolvido com PHP 8.1 e tem o downgrade feito para PHP 7.2 para produção.

O downgrade do código, seu teste e a posterior publicação do plugin para produção são todos automatizados via workflows do GitHub Actions:

  • downgrade_php_tests.yml: faz o downgrade do código e o analisa usando PHP 7.2
  • generate_plugins.yml: gera o plugin para publicação, fazendo o downgrade para PHP 7.2
  • integration_tests.yml: instala o plugin recém-gerado em um conjunto de instâncias InstaWP executando diferentes versões de PHP e executa os testes de integração

Para saber mais, escrevi alguns artigos sobre este tema:

Espero que seja útil 🙏


Assine nossa newsletter

Fique por dentro de todas as atualizações do Gato GraphQL.