Comment préparer votre site WordPress pour PHP 8

Publié: 2022-07-06

Les sites WordPress nécessitent PHP, et comme PHP a évolué, WordPress a suivi. Plus récemment, PHP 7.4 a été la version par défaut de PHP sur la plate-forme WordPress VIP. Cependant, comme PHP 7.4 arrive à la fin de son support de sécurité en novembre 2022, les sites WordPress devront être mis à niveau pour maintenir une sécurité renforcée. Pour cette raison, la plate-forme WordPress VIP déplacera toutes nos applications clientes pour qu'elles fonctionnent sur PHP 8.0.

Ce qui suit est une description des changements et des étapes que nos clients et les autres utilisateurs de WordPress sur d'autres plates-formes peuvent suivre pour se préparer.

Table des matières

  • L'histoire de PHP 8.0
    • Nouvelles fonctionnalités
    • Prolifération du support dans les communautés PHP et WordPress
  • Comment trouver les problèmes de compatibilité avec PHP 8.0
    • Utiliser PHP_CodeSniffer avec la norme PHPCompatibility
    • Traiter les avertissements PHP connus qui sont des erreurs fatales PHP sous PHP 8.0
    • Créer des tests automatisés
    • Utilisez PHPStan/Psalm ou un autre outil d'analyse statique
  • Comment démarrer avec PHP 8.0 sur WordPress VIP
    • Exécutez l'application localement
    • Vérifiez le bot d'analyse de code VIP sur les demandes d'extraction
    • Activez PHP 8 sur vos applications WordPress VIP
    • Bénéficiez d'une aide proactive
  • Qu'en est-il de PHP 8.1 ?

L'histoire de PHP 8.0

Sorti en novembre 2020, PHP 8.0 a fourni plusieurs améliorations et fonctionnalités qui ont rendu le nouveau code (et le code plus court) plus résistant aux bogues.

La plupart des développeurs trouveront des avantages substantiels dans PHP 8.0. Cependant, en tant que version majeure, elle contient plusieurs changements de rupture. Cela rend le passage de PHP 7.4 à PHP 8.0 plus délicat que, par exemple, le passage de PHP 7.3 à PHP 7.4. Plus précisément, il y a eu 49 changements avec rupture dans le noyau de PHP et 169 dans l'ensemble de PHP 8, y compris dans les bibliothèques et les extensions sur lesquelles votre code peut s'appuyer.

La bonne nouvelle est qu'une fois que les organisations auront migré vers PHP 8.0, elles recevront un support de sécurité du projet PHP principal jusqu'en novembre 2023. Après cette date, une organisation devra passer à PHP 8.1, une version mineure nécessitant une modification beaucoup plus petite.

Nouvelles fonctionnalités

PHP 8.0 a été conçu pour 1) corriger les cas extrêmes et les incohérences pour faire de PHP un langage de script plus solide et prévisible, et 2) fournir de nouvelles fonctionnalités pour améliorer le langage dans son ensemble. Celles-ci incluent plusieurs nouvelles syntaxes qui :

  • Facilitez l'écriture de code strictement typé, par exemple, les types d'union, les types static et mixed , l'interface Stringable et les changements dans la gestion des nombres.
  • Réduisez la quantité de code que vous devez gérer, par exemple, l'opérateur nullsafe, la promotion de la propriété du constructeur, l'opérateur de match et les captures sans capture.
  • Simplifiez le code, par exemple en autorisant ::class sur les objets, la virgule finale dans les listes de paramètres, str_contains() , str_starts_with() et str_ends_with() , l'expression throw, les attributs.

Il inclut également les paramètres nommés. Cependant, il convient de noter que le cœur de WordPress ne revendique pas la compatibilité avec cette fonctionnalité. Ainsi, bien que vous puissiez appeler vos propres fonctions personnalisées avec des paramètres nommés, vous ne devez pas appeler les fonctions WordPress, car les noms des paramètres peuvent changer sans avertissement à l'avenir.

Prolifération du support dans les communautés PHP et WordPress

Chaque fois qu'une nouvelle version de PHP est publiée qui inclut une nouvelle syntaxe, il faut du temps pour que les nouvelles syntaxes soient prises en charge dans les communautés PHP et WordPress.

Outils de développement PHP

Les outils de développement PHP tels que Composer, PHPUnit, PHP_CodeSniffer, PHPStan, Xdebug et divers IDE doivent tous reconnaître les nouvelles syntaxes d'une nouvelle version de PHP. Bien que PHP soit continuellement développé, il peut y avoir un délai avant que l'écosystème complet autour d'une nouvelle version ne soit disponible. Souvent, cependant, l'outillage peut être prêt au moment où la version finale est prête parce que le travail de développement a eu lieu sur la base des versions alpha , bêta et des versions candidates qui ont été rendues disponibles à l'avance. Tous ces outils et bien d'autres prennent désormais en charge PHP 8.0, ce qui en fait un bon choix pour développer du code PHP et plus particulièrement pour développer WordPress.

Noyau WordPress

Ensuite, le cœur de WordPress doit prendre en charge PHP 8.0. Le projet WordPress a une longue histoire de compatibilité avec les nouvelles versions de PHP au moment de leur sortie. Selon cet article bien écrit sur Make WP, WordPress a une « compatibilité bêta » avec PHP 8.0 depuis la sortie de WordPress 5.6 en décembre 2020. Que signifie « compatibilité bêta » ? Cela signifie que WordPress peut fonctionner correctement sur PHP 8.0, mais des fonctionnalités telles que la déclaration de types stricts dans les fichiers principaux de WordPress ou l'utilisation de paramètres nommés avec les fonctions principales de WordPress ne sont pas prises en charge.

Plateforme WordPress VIP

La plate-forme WordPress VIP prend en charge PHP 8.0 (et PHP 8.1) depuis mai 2022, y compris la suite de plugins et de fonctionnalités qui permet à la plate-forme de répondre aux besoins des entreprises.

Plugins tiers

WordPress a des dizaines de milliers de plugins et le niveau de prise en charge de PHP 8.0 varie considérablement. Par exemple, des mots nouvellement réservés peuvent toujours être utilisés par un plug-in, ou les paramètres transmis aux fonctions natives PHP peuvent ne pas être du type attendu. En tant que tels, les plugins tiers peuvent être un domaine où des incompatibilités avec PHP 8.0 pourraient avoir un impact sur votre application.

Ci-dessous, vous pouvez apprendre comment vérifier certaines de ces incompatibilités. Les options incluent demander à l'individu/à l'équipe en amont de faire les correctifs et de créer une nouvelle version, ou de demander à une équipe de développement interne ou à une agence, comme l'un de nos partenaires vedettes, de bifurquer le plugin et de faire les correctifs eux-mêmes.

Plugins personnalisés

Presque tous les clients de la plateforme WordPress VIP utilisent un ou plusieurs plugins personnalisés. Comme les plugins tiers, ils doivent également être vérifiés pour leur compatibilité. Demander aux développeurs d'origine de résoudre les problèmes découverts est généralement la meilleure solution.

Thèmes tiers ou personnalisés

Bien que les plugins soient la source la plus probable de problèmes de compatibilité, n'oubliez pas que les thèmes tiers et personnalisés doivent également être compatibles avec PHP 8.0. La même approche de vérification de la compatibilité du code du plugin s'applique au code du thème.

Comment trouver les problèmes de compatibilité avec PHP 8.0

Il existe quatre approches principales que les équipes de développement peuvent utiliser pour examiner le code afin de déterminer les problèmes de compatibilité :

  1. Utilisez PHP_CodeSniffer avec la norme PHPCompatibility.
  2. Traitez les avertissements PHP connus qui sont des erreurs fatales PHP sous PHP 8.0.
  3. Créer des tests automatisés.
  4. Utilisez PHPStan/Psalm ou un autre outil d'analyse statique.

Utiliser PHP_CodeSniffer avec la norme PHPCompatibility

PHP_CodeSniffer (PHPCS) tokenise les fichiers PHP et détecte les violations d'un ensemble défini de normes de codage. Il existe des packages pour les normes de codage WordPress et nos propres normes de codage VIP (que nous encourageons les clients à utiliser).

Il existe également des packages appelés PHPCompatibility et PHPCompatibilityWP, et ces normes analysent une base de code pour la compatibilité entre versions de PHP.

Étant donné que les résultats dépendent des capacités et de la préparation de l'outil, il est essentiel d'utiliser la branche de develop de PHPCompatibility jusqu'à la sortie de la version 10. La version 10 contiendra les sniffs liés à la compatibilité PHP 8.0 (et PHP 8.1). Consultez notre documentation pour savoir comment configurer votre configuration pour utiliser la branche develop . Une fois la version 10 publiée, vous pouvez utiliser cette version à la place.

Le package PHPCompatbilityWP s'appuie sur le package PHPCompatibility mais désactive quelques vérifications pour les éléments de rétrocompatibilité que le noyau WordPress contient lui-même.

Avec PHPCS et PHPCompatibility/PHPCatibilityWP configurés, vous pouvez exécuter une vérification :

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

Le <path-to-code> peut être un seul plugin ou thème personnalisé ou tiers si vous vouliez commencer petit, ou l'ensemble du référentiel si vous vouliez voir toutes les violations qui doivent être étudiées et traitées.

Les étapes d'analyse ne détecteront pas tous les problèmes de compatibilité de version PHP possibles (tels que des types de valeur d'exécution incorrects), mais elles aideront à identifier les problèmes les plus courants liés à la syntaxe.

Traiter les avertissements PHP connus qui sont des erreurs fatales PHP sous PHP 8.0

PHP 8.0 a vu des avertissements de moteur reclassés, où les avertissements sont devenus des erreurs fatales et des exceptions TypeError (et certains avis sont devenus des avertissements). Les textes d'avertissement PHP à rechercher sous PHP 7.4 sont :

  • 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 correction de ces avertissements est essentielle pour que l'application soit compatible avec PHP 8.0.

Remarque : il existe d'autres erreurs fatales sous PHP 8.0 qui n'étaient même pas un avertissement sous PHP 7.4. Les exemples comprennent:

  • Les méthodes privées ne peuvent pas être déclarées finales sauf pour le constructeur.
  • Signatures non valides pour les méthodes magiques.
  • Validation de la signature de la méthode des traits abstraits
  • Utiliser parent:: avec une classe parent.
  • Signatures de méthodes surchargées incompatibles (principe de substitution de Liskov)

Aborder ces changements connus est un bon point de départ. TypeError sera systématiquement lancé pour toutes les fonctions PHP internes, par exemple lorsque des types de paramètres invalides sont passés, même lorsque la vérification stricte des types n'est pas déclarée.

Notez également que l'opérateur @ ne fera plus taire les erreurs fatales sous PHP 8.0.

Naturellement, votre application ne devrait idéalement produire aucune erreur, aucun avertissement et aucune notification. Nous vous encourageons à répondre à tout ce que vous trouvez. Certains avertissements PHP sous 8.x seront des erreurs fatales sous PHP 9.0, par exemple, entraînant potentiellement une logique incorrecte sous PHP 8.x. Construire du temps de développement avant et après la publication pour résoudre ces problèmes et ceux qui "échappent à la découverte" pendant le développement est une bonne pratique. C'est aussi un investissement dans la stabilité du site et sa capacité à répondre avec précision aux critères d'acceptation de la fonctionnalité associée.

Créer des tests automatisés

Il existe de nombreux types de tests automatisés, mais nous entendons ici :

  • Tests unitaires - se moque de toutes les fonctions ou classes définies par WordPress, et n'a pas besoin d'une instance d'une base de données pour être disponible pour exécuter les tests.
  • Tests d'intégration - charge WordPress et utilise une base de données de test réelle

Ce sujet est trop vaste pour être bien couvert ici, mais il y a quelques points à considérer :

  • Les résultats dépendent de l'exhaustivité de la suite de tests. Si vous n'avez pas beaucoup de tests, vous n'aurez pas la couverture nécessaire pour assurer la compatibilité.
  • Utilisez des assertions strictes. Par exemple, l'utilisation assertEquals() effectue une comparaison lâche, tandis que assertSame() vérifie également le type.
  • Utilisez une couverture de code stricte. Ajoutez beStrictAboutCoversAnnotations=”true” et forceCoversAnnotations=”true” au fichier de configuration PHPUnit, puis utilisez les annotations @covers pour trouver le niveau précis de couverture du code international dans les tests.
  • Testez les chemins heureux (comportement basé sur les entrées attendues) et malheureux (comportement basé sur les entrées inattendues) pour vous assurer que les fonctions échouent de la manière attendue, car c'est là que se produisent la plupart des problèmes liés à la rigueur.
  • Exécutez vos tests sur PHP 8.0. Pour les tests d'intégration (WordPress), des modifications ont été apportées en 2021 à la suite de tests de base WordPress qui a été déverrouillée à l'aide des versions ultérieures de PHPUnit, qui à son tour prend en charge PHP 8.0. Ceci est pris en charge par le package WP Test Utils, qui comprend PHPUnit Polyfills, la prise en charge de Brain Monkey et Mockery, des stubs de fonction supplémentaires pour les fonctions WordPress et l'accès à tous les utilitaires de test natifs de WP comme les méthodes d'usine pour la création de contenu.
  • Envisagez d'écrire des tests avant de tenter un correctif, pour être plus sûr que le changement de compatibilité a réussi.

Utilisez PHPStan/Psalm ou un autre outil d'analyse statique

Bien que PHPCS détecte certaines incompatibilités, il existe des modifications d'exécution que PHPCS n'est pas conçu pour détecter. Un exemple qui serait manqué est que les fonctions PHP natives sont plus strictes avec les types qui peuvent être passés en tant que paramètres.

Un outil comme PHPStan, Psalm ou un autre outil d'analyse statique peut vous aider ici. Mais, pour être plus efficaces, ils nécessitent que votre base de code soit utilise des types stricts (types de paramètres et de retour dans le code), soit soit correctement documentée (lignes @param et @return dans DocBlocks).

Ces outils ont généralement des niveaux de règles qui permettent de résoudre d'abord les problèmes de niveau le plus bas, puis d'intégrer progressivement l'outil pour améliorer la qualité de votre base de code.

Vous pouvez ajouter des connaissances pour les types de code principal de WordPress via des extensions telles que phpstan-wordpress et psalm-plugin-wordpress.

Une fois configuré, chaque exécution mettra en évidence l'endroit où vous transmettez des types inattendus dans les fonctions, ce qui peut entraîner la levée d'exceptions TypeError fatales. Chacun d'entre eux devra être corrigé.

Dans de nombreux cas, vous pouvez supprimer une exception TypeError en utilisant des blocs try-catch ou un transtypage. Cependant, nous vous déconseillons fortement de le faire. La correction de la cause première conduira à un code plus fort, moins fragile et sujet aux erreurs, et sera presque toujours payant à long terme.

Comment démarrer avec PHP 8.0 sur WordPress VIP

Exécutez l'application localement

L'exécution locale d'une instance de l'application est une première étape judicieuse pour pouvoir détecter et résoudre tout problème de compatibilité. Bien que vous puissiez utiliser n'importe quel environnement de développement local, pour assurer la meilleure parité avec la plateforme WordPress VIP, nous vous recommandons l'environnement de développement local VIP. En exécutant la commande vip dev-env create --php=8.0 (avec VIP-CLI 2.9.5 ou version ultérieure) puis en complétant le reste de l'assistant de configuration, votre application s'exécutera localement avec PHP 8.0.

Vérifiez le bot d'analyse de code VIP sur les demandes d'extraction

Si vous regardez toutes les demandes d'extraction faites à votre référentiel sous l'organisation wpcomvip, vous verrez le bot d'analyse de code VIP vous donner des commentaires sur PHPCS, le linting PHP et le linting SVG.

Pour l'étape PHP Linting, le bot lintera le code PHP avec n'importe quelle version de PHP utilisée pour une application sur laquelle le référentiel se déploie. Si cette version est PHP 7.4, elle sera désormais automatiquement pelucheuse en utilisant PHP 8.0 également, en préparation du prochain changement.

Activez PHP 8 sur vos applications WordPress VIP

Une fois que vous avez effectué autant de vérifications et de corrections que possible localement, il est temps d'activer PHP 8.0 sur votre application WordPress VIP. Commencez par votre environnement le plus bas et vérifiez que tout semble bon (y compris les journaux PHP via vip-cli ou les journaux de santé dans le tableau de bord VIP) avant de passer à l'environnement de production.

Pour activer PHP 8.0 sur un environnement, ouvrez un ticket Zendesk nous indiquant sur quelle application et quel environnement vous souhaitez l'activer.

Nous publierons bientôt une nouvelle fonctionnalité sur le tableau de bord VIP pour permettre de changer la version de PHP sans avoir besoin d'ouvrir un ticket. Vérifiez toujours le Lobby pour les dernières informations.

Bénéficiez d'une aide proactive

Les équipes de compte pour les clients Premier contactent déjà les clients pour discuter de la manière dont nous pouvons les aider. Ils recevront les résultats de PHPCS et des conseils sur la façon d'exécuter eux-mêmes ces vérifications. Les avertissements PHP qui deviendront des erreurs fatales seront également mis en évidence, ce qui leur donnera une longueur d'avance sur la résolution des incompatibilités.

Qu'en est-il de PHP 8.1 ?

La plate-forme WordPress VIP prend également en charge PHP 8.1. Il y a moins de changements entre PHP 8.0 et PHP 8.1 qu'entre PHP 7.4 et 8.0, ce qui signifie qu'il devrait y avoir moins d'incompatibilités à résoudre.

PHP 8.1 :

  • Bénéficie d'un support actif des développeurs principaux de PHP jusqu'en novembre 2023 et d'un support de sécurité jusqu'en novembre 2024.
  • Peut gérer plus de requêtes par seconde que PHP 8.0.
  • Prend en charge la "compatibilité bêta" sur WordPress 5.9 et versions ultérieures - cela signifie qu'il existe des avis de dépréciation en préparation pour PHP 9, mais n'affecte pas le comportement du noyau WordPress.

Les changements utiles requis pour PHP 8.0, tels que l'utilisation de code strictement typé et l'ajout de tests automatisés, aideront au déploiement de PHP 8.1, ainsi qu'aux mises à niveau pour WordPress 6.1, 6.2, 6.3 et au-delà, ainsi que toutes les versions de fonctionnalités que vous faites. Le processus d'assurance qualité est souvent le goulot d'étranglement, donc l'utilisation de certains des outils et approches que nous avons décrits peut réduire le travail manuel et vous donner plus de confiance lors du déploiement de ces changements.

Si les clients ont des questions sur PHP 8.0, veuillez ouvrir des tickets avec nous.