Migrer un WordPress vers PHP 8.x : compatibilité, tests, outils
Pourquoi migrer vers PHP 8.x ?
- Sécurité & support : les versions obsolètes ne reçoivent plus de correctifs. Rester à jour est indispensable.
- Performance : moteur plus rapide, optimisations d’OPcache, améliorations continues (8.0 → 8.3).
- Compatibilité écosystème : la plupart des extensions premium & thèmes modernes ciblent 8.1+.
- Qualité code : nouvelles fonctionnalités (types, attributes, enums 8.1, etc.) qui améliorent la robustesse.
Pré-requis & check de départ
- Backups complets (fichiers + base de données) et restauration testée.
- Accès : WP-CLI, FTP/SSH, gestion de version PHP côté hébergeur (ou Docker si VPS).
- Environnement de staging (copie du site) pour simuler la migration avant la prod.
- Inventaire : liste des plugins, thème parent/enfant, must-use (mu-plugins), snippets functions.php.
- Version WordPress : mettre à jour le core et s’assurer que le site fonctionne déjà parfaitement en l’état.
Carte des risques spécifiques WordPress
- Fonctions dépréciées dans WordPress, PHP, WooCommerce ou Divi (warnings, notices, deprecated).
- Extensions abandonnées ou non testées sur PHP 8.x.
- Snippets “rapides” (ex: filtres/shortcodes) qui supposent des types laxistes (null/array/string).
- Compatibilité WooCommerce : templates surchargés, passerelles de paiement, hooks/filters.
- Builder Divi : modules custom, hooks, shortcodes personnalisés.
Outils indispensables pour la migration
1) WP-CLI (audit, mises à jour, santé)
wp --info
wp core verify-checksums
wp plugin list --update=available
wp theme list
wp site health info
2) PHPCompatibility avec PHP_CodeSniffer
Analyse statique pour repérer les incompatibilités 8.x dans votre code (thème enfant, plugin custom…).
# Installation locale (ex. via Composer)
composer require --dev dealerdirect/phpcodesniffer-composer-installer phpcompatibility/php-compatibility
# Exemple de ruleset phpcs.xml (simplifié ; < et > sont échappés) :
<?xml version="1.0"?>
<ruleset name="WP PHP 8.x">
<rule ref="PHPCompatibility"/>
<config name="testVersion" value="8.0-8.3"/>
<file>wp-content/themes/votre-theme-enfant</file>
<file>wp-content/mu-plugins</file>
<file>wp-content/plugins/votre-plugin-custom</file>
</ruleset>
# Lancer l’analyse
vendor/bin/phpcs
3) Static analysis (PHPStan ou Psalm)
Monter progressivement le niveau (ex. PHPStan niveau 3 → 6) pour détecter types incohérents, nullables, retours manquants.
composer require --dev phpstan/phpstan
# phpstan.neon (extrait)
parameters:
level: 6
paths:
- wp-content/themes/votre-theme-enfant
- wp-content/plugins/votre-plugin-custom
ignoreErrors:
- '#dynamic_property#'
4) Rector (optionnel, accélère les refactors)
Automatise certains ajustements (types, signatures). Toujours relire les diffs.
composer require --dev rector/rector
# rector.php (extrait minimal)
<?php
return static function (Rector\Config\RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/wp-content/themes/votre-theme-enfant',
__DIR__ . '/wp-content/plugins/votre-plugin-custom',
]);
$rectorConfig->sets([
Rector\Set\ValueObject\SetList::PHP_80,
Rector\Set\ValueObject\SetList::PHP_81,
Rector\Set\ValueObject\SetList::PHP_82,
]);
};
5) Logs de dépréciations & Query Monitor
Activez WP_DEBUG_LOG en staging pour capter warnings/notice/deprecated, et installez Query Monitor pour les repérer rapidement.
// wp-config.php (staging)
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
6) Tests automatisés (quand c’est possible)
- PHPUnit pour la logique PHP custom (plugins, librairies).
- Playwright/Panther pour des parcours e2e (panier, paiement test, contact, recherche).
Environnement de staging (exemple Docker)
Si vous avez un VPS/localhost, isolez un environnement PHP 8.3 pour tester sans toucher la prod.
# docker-compose.yml (exemple)
services:
php:
image: php:8.3-fpm
volumes:
- ./:/var/www/html
environment:
- PHP_MEMORY_LIMIT=512M
web:
image: nginx:alpine
volumes:
- ./:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "8080:80"
db:
image: mariadb:10.6
environment:
- MARIADB_ROOT_PASSWORD=secret
- MARIADB_DATABASE=wp
Plan de migration pas à pas
Étape 1 — Mettre à jour sans casser
- Core WordPress à jour + traductions.
- Extensions & thèmes : mettez tout à niveau, supprimez le superflu.
- Vérifier le changelog des extensions sensibles (WooCommerce, SEO, cache, paiements, builder).
Étape 2 — Cloner en staging & activer PHP 8.x
- Copie fichiers + DB, reconfig
wp-config.php(URL, DB). - Basculer la version PHP du serveur de staging en 8.x (8.1/8.2/8.3 selon cible).
- Vider caches (plugin + OPCache) et
wp transient delete --all.
Étape 3 — Scanner et corriger
- Lancer PHPCompatibility + PHPStan/Psalm.
- Corriger signatures, opérateurs, gestion
null, cast explicites. - Remplacer fonctions obsolètes, vérifier les librairies embarquées.
Étape 4 — Tests fonctionnels
- Parcours critiques : panier → paiement (mode sandbox), formulaire de contact, recherche, inscription, upload.
- Back-office : création d’article, média, mise à jour d’un produit, import/export CSV.
- Divi : édition d’une page, modules dynamiques, global presets.
- WooCommerce : variations, coupons, frais de port, facturation TVA.
Étape 5 — Performance & configuration PHP
Vérifiez OPcache et les limites.
; php.ini (extraits recommandés)
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=1
opcache.revalidate_freq=2
memory_limit=512M
max_execution_time=120
Étape 6 — Go live contrôlé
- Fenêtre de maintenance courte, pages caches préparées.
- Basculer la prod sur PHP 8.x.
- Vérifier logs d’erreur, pages critiques et paiement réel de faible montant.
Points d’attention fréquents (et correctifs types)
Typage plus strict
PHP 8.x remonte plus d’erreurs là où 7.x “tolérait”. Exemples :
// Avant : on supposait une string
$title = $post_meta['title'] ?? '';
echo trim($title);
// Mieux (défensif)
$title = isset($post_meta['title']) && is_string($post_meta['title']) ? $post_meta['title'] : '';
echo trim($title);
Comparaisons & opérateurs
- Évitez les comparaisons lâches
==quand le type peut varier ; préférez===. - Verrouillez les retours de filtres/hooks : documenter les types attendus.
Callbacks, signatures & valeurs par défaut
// Mauvais : signature incompatible avec un hook qui envoie un objet
add_filter('my_filter', function(array $data) { ... });
// OK : accepter le type réel ou valider avant usage
add_filter('my_filter', function($payload) {
if (!is_array($payload)) return $payload;
...
return $payload;
});
Gestion des erreurs & Exceptions
Quelques fonctions lèvent maintenant des exceptions à la place de warnings. Entourez les appels sensibles :
try {
$image = imagecreatefromstring($blob);
} catch (Throwable $e) {
error_log('Image error: '.$e->getMessage());
$image = null;
}
WooCommerce : templates & hooks
- Mettez à jour les template overrides du thème enfant (répertoire
woocommerce/), supprimez les fichiers obsolètes. - Testez passerelles de paiement en mode test (Webhook, signature, retours).
- Vérifiez les filtres de prix/TVA (arrondis, locales) avec PHP 8.x (intl/extension bcmath si utilisée).
Divi : modules custom
- Vérifiez les modules personnalisés (classes PHP) : types de paramètres,
shortcodes, données$_POST/$_GETfiltrées. - Assurez-vous que tout JS/CSS dynamiques se base sur des APIs stables du builder.
Composer & gestion fine des dépendances
Si votre projet utilise Composer, verrouillez la plateforme pour tester localement le même runtime qu’en prod :
{
"config": {
"platform": { "php": "8.3.0" }
}
}
Mettez à jour les libs :
composer update --with-all-dependencies
Qualité continue : intégrer au pipeline
- CI : exécuter PHPCompatibility, PHPStan et, si possible, tests e2e sur chaque PR.
- Snapshoot visuel (optionnel) pour détecter les régressions d’affichage (utile avec Divi).
- Mesure de perf : TTFB, LCP côté front, temps moyen de génération PHP côté back.
Stratégie de rollback
Toujours prête avant la bascule :
- Conserver l’option de retour à l’ancienne version PHP côté hébergeur (ou un tag Docker stable).
- Snapshot base de données & fichiers juste avant la migration.
- Plan clair : qui fait quoi si incident (réversibilité < 10 minutes).
Conclusion
Migrer un WordPress vers PHP 8.x est surtout une affaire de méthode : staging, analyses statiques, logs propres, tests fonctionnels, puis bascule encadrée et mesurée. Avec la check-list et les outils ci-dessus, vous minimisez le risque et profitez des gains de performances et de sécurité — sans surprises en production.