Cómo preparar su sitio de WordPress para PHP 8

Publicado: 2022-07-06

Los sitios de WordPress requieren PHP y, a medida que PHP ha evolucionado, WordPress se ha mantenido al día. Más recientemente, PHP 7.4 ha sido la versión predeterminada de PHP en la plataforma VIP de WordPress. Sin embargo, como PHP 7.4 llega al final de su soporte de seguridad en noviembre de 2022, los sitios de WordPress deberán actualizarse para mantener una seguridad sólida. Por esta razón, la plataforma VIP de WordPress trasladará todas las aplicaciones de nuestros clientes para que se ejecuten en PHP 8.0.

Lo que sigue es una descripción de los cambios y los pasos que tanto nuestros clientes como otros usuarios de WordPress en otras plataformas pueden seguir para prepararse.

Tabla de contenido

  • La historia de PHP 8.0
    • Nuevas características
    • Proliferación de soporte en las comunidades de PHP y WordPress
  • Cómo encontrar problemas de compatibilidad con PHP 8.0
    • Use PHP_CodeSniffer con el estándar PHPCompatibility
    • Abordar las advertencias de PHP conocidas que son errores fatales de PHP en PHP 8.0
    • Crear pruebas automatizadas
    • Use PHPStan/Psalm u otra herramienta de análisis estático
  • Cómo comenzar con PHP 8.0 en WordPress VIP
    • Ejecutar la aplicación localmente
    • Compruebe el bot de análisis de código VIP en las solicitudes de incorporación de cambios
    • Habilite PHP 8 en sus aplicaciones VIP de WordPress
    • Aproveche la ayuda proactiva
  • ¿Qué pasa con PHP 8.1?

La historia de PHP 8.0

Lanzado en noviembre de 2020, PHP 8.0 proporcionó varias mejoras y características que hicieron que el código nuevo (y el código más corto) fuera más resistente a los errores.

La mayoría de los desarrolladores encontrarán beneficios sustanciales en PHP 8.0. Sin embargo, como versión principal, contiene varios cambios importantes. Esto hace que el cambio de PHP 7.4 a PHP 8.0 sea más complicado que, por ejemplo, el cambio de PHP 7.3 a PHP 7.4. Específicamente, hubo 49 cambios importantes en el núcleo de PHP y 169 en PHP 8 en general, incluso en bibliotecas y extensiones en las que puede confiar su código.

La buena noticia es que una vez que las organizaciones migren a PHP 8.0, recibirán soporte de seguridad del proyecto PHP central hasta noviembre de 2023. Después de esa fecha, una organización deberá actualizar a PHP 8.1, una versión menor que requiere un cambio mucho menor.

Nuevas características

PHP 8.0 fue diseñado para 1) corregir casos extremos e inconsistencias para hacer de PHP un lenguaje de secuencias de comandos más sólido y predecible, y 2) proporcionar nuevas funciones para mejorar el lenguaje en general. Estos incluyen varias sintaxis nuevas que:

  • Facilite la escritura de código estrictamente tipado, por ejemplo, tipos de unión, tipos static y mixed , interfaz Stringable y cambios en el manejo de números.
  • Reduzca la cantidad de código que tiene que mantener, por ejemplo, el operador nullsafe, la promoción de la propiedad del constructor, el operador de match y las capturas que no capturan.
  • Simplifique el código, como permitir ::class en objetos, coma final en listas de parámetros, str_contains() , str_starts_with() y str_ends_with() , expresión de lanzamiento, atributos.

También incluye parámetros con nombre. Sin embargo, vale la pena señalar que el núcleo de WordPress no afirma ser compatible con esta función. Entonces, si bien puede llamar a sus propias funciones personalizadas con parámetros con nombre, no debe llamar a las funciones de WordPress, ya que los nombres de los parámetros pueden cambiar sin previo aviso en el futuro.

Proliferación de soporte en las comunidades de PHP y WordPress

Cada vez que se lanza una nueva versión de PHP que incluye una nueva sintaxis, se necesita tiempo para que las nuevas sintaxis sean compatibles en las comunidades de PHP y WordPress.

Herramientas para desarrolladores de PHP

Las herramientas de desarrollo de PHP como Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug y varios IDE necesitan reconocer las nuevas sintaxis de una nueva versión de PHP. Si bien PHP se desarrolla continuamente, puede haber un retraso antes de que esté disponible el ecosistema completo en torno a una nueva versión. Sin embargo, a menudo, las herramientas pueden estar listas para cuando la versión final esté lista porque el trabajo de desarrollo se ha realizado en función de las versiones alfa , beta y candidatas a la versión que se han puesto a disposición con anticipación. Todas estas herramientas y más ahora son compatibles con PHP 8.0, lo que las convierte en una buena opción para desarrollar código PHP y específicamente para desarrollar WordPress.

Núcleo de WordPress

A continuación, el núcleo de WordPress debe ser compatible con PHP 8.0. El proyecto de WordPress tiene una larga historia de compatibilidad con las nuevas versiones de PHP en el momento de su lanzamiento. Según esta publicación bien escrita en Make WP, WordPress ha tenido "compatibilidad beta" con PHP 8.0 desde el lanzamiento de WordPress 5.6 en diciembre de 2020. ¿Qué significa "compatibilidad beta"? Significa que WordPress puede funcionar bien en PHP 8.0, pero no se admiten funciones como la declaración de tipos estrictos en los archivos principales de WordPress o el uso de parámetros con nombre con las funciones principales de WordPress.

Plataforma VIP de WordPress

La plataforma VIP de WordPress es compatible con PHP 8.0 (y PHP 8.1) desde mayo de 2022, incluido el conjunto de complementos y funciones que permiten que la plataforma satisfaga las necesidades empresariales.

Complementos de terceros

WordPress tiene decenas de miles de complementos y el nivel de soporte para PHP 8.0 varía ampliamente. Por ejemplo, es posible que un complemento siga utilizando palabras recién reservadas, o que los parámetros que se pasan a las funciones nativas de PHP no sean del tipo que ahora se espera. Como tal, los complementos de terceros pueden ser un área donde las incompatibilidades con PHP 8.0 podrían afectar su aplicación.

A continuación, puede obtener información sobre cómo verificar algunas de estas incompatibilidades. Las opciones incluyen pedirle a la persona/equipo ascendente que haga las correcciones y haga una nueva versión, o tener un equipo de desarrollo interno o una agencia, como uno de nuestros socios destacados, bifurcar el complemento y hacer las correcciones ellos mismos.

Complementos personalizados

Casi todos los clientes de la plataforma VIP de WordPress usan uno o más complementos personalizados. Al igual que los complementos de terceros, también es necesario verificar su compatibilidad. Pedirle a los desarrolladores originales que aborden los problemas descubiertos es generalmente el mejor curso de acción.

Temas personalizados o de terceros

Si bien los complementos son la fuente más probable de problemas de compatibilidad, no olvide que los temas personalizados y de terceros también deben ser compatibles con PHP 8.0. El mismo enfoque de verificar la compatibilidad del código del complemento se aplica al código del tema.

Cómo encontrar problemas de compatibilidad con PHP 8.0

Hay cuatro enfoques principales que los equipos de desarrollo pueden usar para revisar el código y determinar los problemas de compatibilidad:

  1. Use PHP_CodeSniffer con el estándar PHPCompatibility.
  2. Resuelva las advertencias de PHP conocidas que son errores fatales de PHP en PHP 8.0.
  3. Crear pruebas automatizadas.
  4. Use PHPStan/Psalm u otra herramienta de análisis estático.

Use PHP_CodeSniffer con el estándar PHPCompatibility

PHP_CodeSniffer (PHPCS) tokeniza archivos PHP y detecta violaciones de un conjunto definido de estándares de codificación. Hay paquetes para los estándares de codificación de WordPress y nuestros propios estándares de codificación VIP (que animamos a los clientes a usar).

También hay paquetes llamados PHPCompatibility y PHPCompatibilityWP, y estos estándares analizan una base de código para la compatibilidad entre versiones de PHP.

Debido a que los resultados dependen de las capacidades y la preparación de la herramienta, es esencial usar la rama de develop de PHPCompatibility hasta que se publique la versión 10. La versión 10 contendrá los sniffs relacionados con la compatibilidad con PHP 8.0 (y PHP 8.1). Consulte nuestros documentos para obtener instrucciones sobre cómo configurar su configuración para usar la rama de develop . Una vez que se lanza la versión 10, puede usar esa versión en su lugar.

El paquete PHPCompatbilityWP se basa en el paquete PHPCompatibility, pero desactiva algunos elementos de compatibilidad con versiones anteriores que contiene el núcleo de WordPress.

Con PHPCS y PHPCompatibility/PHPCompatibilityWP configurados, puede ejecutar una verificación:

 phpcs --standard=PHPCompatibilityWP --severity=1 --runtime-set testVersion 8.0- --extensions=php <path-to-code>

La <path-to-code> podría ser un solo complemento o tema personalizado o de terceros si desea comenzar poco a poco, o todo el repositorio si desea ver todas las infracciones que deben investigarse y abordarse.

Los pasos de análisis no detectarán todos los posibles problemas de compatibilidad de versiones de PHP (como tipos de valores de tiempo de ejecución incorrectos), pero ayudarán a identificar los problemas más comunes relacionados con la sintaxis.

Abordar las advertencias de PHP conocidas que son errores fatales de PHP en PHP 8.0

PHP 8.0 vio algunas advertencias de motor reclasificadas, donde las advertencias se convirtieron en errores fatales y excepciones de error de tipo (y algunos avisos se convirtieron en advertencias). Los textos de advertencia de PHP que debe buscar en PHP 7.4 son:

  • Attempt to assign property '*' of non-object
  • Attempt to modify property '*' of non-object
  • Attempt to increment/decrement property '*' of non-object
  • Creating default object from empty value
  • Cannot use a scalar value as an array
  • Cannot add element to the array as the next element is already occupied
  • Cannot unset offset in a non-array variable
  • Only arrays and Traversables can be unpacked
  • Invalid argument supplied for foreach()
  • Illegal offset type
  • Illegal offset type in isset or empty
  • Illegal offset type in unset
  • Cannot assign an empty string to a string offset
  • Division by zero
  • Use of undefined constant *

La reparación de estas Advertencias es fundamental para que la aplicación sea compatible con PHP 8.0.

Nota: hay otros errores fatales en PHP 8.0 que ni siquiera eran una advertencia en PHP 7.4. Ejemplos incluyen:

  • Los métodos privados no pueden declararse finales excepto el constructor.
  • Firmas no válidas para métodos mágicos.
  • Validación de firma de método de rasgo abstracto
  • Usando parent:: con una clase padre.
  • Firmas de métodos sobrecargados incompatibles (principio de sustitución de Liskov)

Abordar estos cambios conocidos es un buen lugar para comenzar. TypeError se generará constantemente para todas las funciones internas de PHP, por ejemplo, cuando se pasan tipos de parámetros no válidos, incluso cuando no se declara una verificación de tipo estricta.

Además, tenga en cuenta que el operador @ ya no silenciará los errores fatales en PHP 8.0.

Naturalmente, lo ideal es que su aplicación no produzca errores, advertencias ni avisos. Se le anima a abordar cualquiera que encuentre. Algunas advertencias de PHP en 8.x serán errores fatales en PHP 9.0, por ejemplo, lo que podría resultar en una lógica incorrecta en PHP 8.x. Construir en el tiempo de desarrollo antes y después del lanzamiento para solucionar tales problemas y aquellos que "escapan al descubrimiento" durante el desarrollo es una buena práctica. También es una inversión en la estabilidad del sitio y su capacidad para cumplir con precisión los criterios de aceptación de la característica asociada.

Crear pruebas automatizadas

Hay muchos tipos diferentes de pruebas automatizadas, pero aquí nos referimos a:

  • Pruebas unitarias : se burla de cualquier función o clase definida por WordPress, y no necesita que una instancia de una base de datos esté disponible para ejecutar las pruebas.
  • Pruebas de integración: carga WordPress y utiliza una base de datos de prueba real

Este tema es demasiado grande para cubrirlo bien aquí, pero hay algunas cosas a considerar:

  • Los resultados dependen de la integridad del conjunto de pruebas. Si no tiene muchas pruebas, carecerá de la cobertura necesaria para garantizar la compatibilidad.
  • Usa afirmaciones estrictas. Por ejemplo, el uso de assertEquals() hace una comparación poco precisa, mientras que assertSame() también verifica el tipo.
  • Utilice una cobertura de código estricta. Agregue beStrictAboutCoversAnnotations=”true” y forceCoversAnnotations=”true” al archivo de configuración de PHPUnit y luego use las anotaciones @covers para encontrar el nivel exacto de cobertura de código internacional en las pruebas.
  • Pruebe las rutas felices (comportamiento basado en entradas esperadas) e infelices (comportamiento basado en entradas inesperadas) para asegurarse de que las funciones fallan de la manera esperada, ya que aquí es donde ocurren la mayoría de los problemas relacionados con el rigor.
  • Ejecute sus pruebas en PHP 8.0. Para las pruebas de integración (WordPress), se realizaron cambios en 2021 en el conjunto de pruebas principal de WordPress que se desbloqueó con las versiones posteriores de PHPUnit, que a su vez es compatible con PHP 8.0. Esto es compatible con el paquete WP Test Utils, que incluye compatibilidad con PHPUnit Polyfills, Brain Monkey y Mockery, funciones adicionales para las funciones de WordPress y acceso a todas las utilidades de prueba nativas de WP, como los métodos de fábrica para la creación de contenido.
  • Considere escribir pruebas antes de intentar una corrección, para estar más seguro de que el cambio de compatibilidad se ha realizado correctamente.

Use PHPStan/Psalm u otra herramienta de análisis estático

Si bien PHPCS detectará algunas incompatibilidades, hay algunos cambios en el tiempo de ejecución que PHPCS no está diseñado para detectar. Un ejemplo que se perdería es que las funciones nativas de PHP son más estrictas con los tipos que se pueden pasar como parámetros.

Una herramienta como PHPStan, Psalm u otra herramienta de análisis estático puede ayudar aquí. Pero, para ser más efectivos, requieren que su código base use tipos estrictos (parámetros y tipos de devolución en el código) o que esté correctamente documentado (líneas @param y @return en DocBlocks).

Estas herramientas suelen tener niveles de regla que permiten solucionar primero los problemas de nivel más bajo y luego integrar gradualmente la herramienta para mejorar la calidad de su base de código.

Puede agregar conocimiento para tipos para el código central de WordPress a través de extensiones como phpstan-wordpress y psalm-plugin-wordpress.

Una vez configurada, cada ejecución resaltará dónde está pasando tipos inesperados a funciones, lo que puede causar que se generen excepciones fatales de TypeError. Cada uno de estos tendrá que ser arreglado.

En muchos casos, es posible que pueda suprimir una excepción TypeError mediante el uso de bloques try-catch o encasillamiento. Sin embargo, le recomendamos encarecidamente que no lo haga. Arreglar la causa raíz conducirá a un código más fuerte, menos frágil y propenso a errores, y casi siempre dará sus frutos a largo plazo.

Cómo comenzar con PHP 8.0 en WordPress VIP

Ejecutar la aplicación localmente

Ejecutar una instancia de la aplicación localmente es un primer paso sensato para poder detectar y solucionar cualquier problema de compatibilidad. Si bien puede usar cualquier entorno de desarrollo local, para garantizar la mejor paridad con la plataforma VIP de WordPress, recomendamos el entorno de desarrollo local VIP. Al ejecutar el comando vip dev-env create --php=8.0 (con VIP-CLI 2.9.5 o posterior) y luego completar el resto del asistente de configuración, su aplicación se ejecutará localmente con PHP 8.0.

Compruebe el bot de análisis de código VIP en las solicitudes de incorporación de cambios

Si observa cualquier solicitud de extracción realizada en su repositorio bajo la organización wpcomvip, verá que el bot de análisis de código VIP le brinda comentarios sobre PHPCS, PHP linting y SVG linting.

Para el paso de Linting de PHP, el bot limpiará el código PHP con cualquier versión de PHP que se use para una aplicación en la que se implementa el repositorio. Si esa versión es PHP 7.4, ahora también usará PHP 8.0 automáticamente, en preparación para el próximo cambio.

Habilite PHP 8 en sus aplicaciones VIP de WordPress

Una vez que haya realizado todas las comprobaciones y correcciones que pueda localmente, es hora de habilitar PHP 8.0 en su aplicación VIP de WordPress. Comience con su entorno más bajo y verifique que todo se vea bien (incluidos los registros de PHP a través de vip-cli o los registros de salud en el panel VIP) antes de pasar al entorno de producción.

Para habilitar PHP 8.0 en un entorno, abra un ticket de Zendesk para informarnos en qué aplicación y entorno desea habilitarlo.

Pronto lanzaremos una nueva función en el Panel VIP para permitir que se cambie la versión de PHP sin necesidad de abrir un ticket. Consulte siempre el Lobby para obtener la información más reciente.

Aproveche la ayuda proactiva

Los equipos de cuentas de los clientes Premier ya se están comunicando con los clientes para analizar cómo podemos ayudarlos. Se les enviarán los resultados de PHPCS y se les proporcionará orientación sobre cómo ejecutar estas comprobaciones ellos mismos. También se resaltarán las advertencias de PHP que se convertirán en errores fatales, lo que les dará una ventaja para abordar las incompatibilidades.

¿Qué pasa con PHP 8.1?

La plataforma VIP de WordPress también es compatible con PHP 8.1. Hay menos cambios entre PHP 8.0 y PHP 8.1 que entre PHP 7.4 y 8.0, lo que significa que debería haber menos incompatibilidades que abordar.

PHP 8.1:

  • Tiene soporte activo de los desarrolladores principales de PHP hasta noviembre de 2023 y soporte de seguridad hasta noviembre de 2024.
  • Puede manejar más solicitudes por segundo que PHP 8.0.
  • Tiene soporte de "compatibilidad beta" en WordPress 5.9 y superior; esto significa que hay algunos avisos de obsolescencia en preparación para PHP 9, pero no afecta el comportamiento del núcleo de WordPress.

Los cambios útiles necesarios para PHP 8.0, como el uso de código estrictamente escrito y la adición de pruebas automatizadas, ayudarán con el lanzamiento de PHP 8.1, así como con las actualizaciones para WordPress 6.1, 6.2, 6.3 y posteriores, así como con cualquier lanzamiento de funciones que realice. El proceso de control de calidad suele ser el cuello de botella, por lo que el uso de algunas de las herramientas y enfoques que hemos descrito puede reducir el trabajo manual y brindarle más confianza al implementar estos cambios.

Si los clientes tienen preguntas sobre PHP 8.0, abra tickets con nosotros.