Il y a quelques jours, nous avons mis à jour nos serveurs de production de php5.6 à php7.2. Si dans l’ensemble tout s’est bien passé, j’ai eu une assez mauvaise surprise en voulant me connecter aux back-offices de nos sites propulsés par WordPress.
J’accédais bien au site et au formulaire d’identification pour se connecter au back-office mais malheureusement, une fois le bouton « Se connecter » cliqué, je tombais sur une page affichant la redoutable erreur 500 : Internal Server Error (Erreur interne du serveur dans la langue de Molière).
La première chose à faire dans ces cas-là, c’est de trouver l’origine du problème. Logique me direz-vous ! Sachez que souvent, les erreurs 500 sont causées par des extensions présentant des incompatibilités ou des erreurs dans leur code source. Nous allons donc voir comment vérifier que votre erreur 500 n’est pas dû à une extension récalcitrante.
Les fichiers journaux du serveur
L’erreur 500 étant une erreur interne du serveur (comme son nom l’indique si bien), la solution la plus rapide et la plus efficace reste d’ouvrir les fichiers journaux du serveur (logs dans la langue de Shakespeare). Dans mon cas, cela m’a permis de très vite identifier mon problème :
Fatal error: Uncaught Error: [] operator not supported for strings in /path/to/worpress/wp-content/plugins/revslider/inc_php/framework/base_admin.class.php:72 Stack trace: #0 /path/to/worpress/wp-content/plugins/revslider/revslider_admin.php(157): UniteBaseAdminClassRev::addMetaBox('Revolution Slid...', Object(UniteSettingsAdvancedRev), Array, NULL) #1 /path/to/worpress/wp-content/plugins/revslider/revslider_admin.php(68): RevSliderAdmin->addSliderMetaBox() #2 /path/to/worpress/wp-content/plugins/revslider/revslider_admin.php(40): RevSliderAdmin->init() #3 /path/to/worpress/wp-content/plugins/revslider/revslider.php(146): RevSliderAdmin->__construct('/path/to/worpress/wp...') #4 /path/to/worpress/wp-admin/includes/plugin.php(1897): include('/path/to/worpress/wp...') #5 /path/to/worpress/wp-admin/plugins.php(178): plugin_sandbox_scrape('revslider/revsl...') #6 {main} thrown in /path/to/worpress/wp-content/plugins/revslider/inc_php/framework/base_admin.class.php on line 72
C’est donc l’extension « Revolution Slider » de ThemePunch qui générait une erreur fatale. Le message d’erreur étant assez clair, il m’a été facile de corriger le script incriminé. Mais j’y reviendrai plus tard.
Si vous n’avez pas accès aux fichiers journaux du serveur ou que tout simplement ils sont illisibles à vos yeux, il existe une autre méthode, certes plus chronophage, mais tout aussi efficace.
Désactiver les extensions
Cette autre méthode est relativement simple pour vérifier que l’erreur 500 n’est pas due à une extension. Il vous faudra cependant un accès FTP ou SSH au serveur où se trouve votre instance WordPress.
- Via FTP ou SSH, rendez vous dans le répertoire
/wp-content
de votre wordpress. - Renommez le répertoire
/plugins
en/plugins-old
. Cela va avoir pour effet de désactiver toutes les extensions de votre site. - Dans votre navigateur, vérifiez que vous accédez désormais à votre back-office. N.B. : Si ce n’est pas le cas, c’est que l’erreur 500 n’est pas dû à une extension récalcitrante et de ce fait, cette méthode ne vous permettra malheureusement pas de résoudre votre problème. 🙁
- Créez maintenant un nouveau répertoire
/plugins
. - Copiez une extension du répertoire
/plugins-old
dans le répertoire/plugins
- Depuis votre back-office, activez l’extension :
a. Si elle s’active sans encombre, répétez les étapes 5 et 6 avec une autre extension.
b. Si elle ne s’active pas, un message d’erreur s’affichera au dessus de la liste des extensions. Vous pourrez alors constater l’erreur. - Maintenant que vous avez identifiez l’extension qui pose problème, vous avez deux solutions :
a. Corriger l’erreur, ce qui demande la plupart du temps de modifier un ou des scripts en php
b. Remplacer l’extension par une autre aux fonctionnalités similaires
Pour ma part, j’ai opté pour la solution a. Je n’avais vraiment pas envie d’avoir à reconfigurer une autre extension « slider ».
Correction de l’extension RevSlider
Php, jusqu’aux versions les plus récentes, a toujours été très permissif. Cela lui a d’ailleurs valu sa mauvaise réputation de langage de « bricoleurs ». Par exemple, il était tout à fait possible de déclarer une variable comme chaîne de caractères et l’utiliser ensuite comme un tableau. Certes, ça a toujours été considéré comme une mauvaise pratique mais comme le langage le permettait, de nombreux développeurs ne faisaient pas attention. Mea culpa : moi-même, il m’est arrivé de le faire. Heureusement, depuis sa version 7 (il me semble), php ne permet plus ce genre de mauvaises pratiques. Dans un sens, je pense que la « professionnalisation » de php lui est et lui sera très salutaire. Ce n’est que mon avis cela dit.
Bref, revenons à nos moutons électriques. Tel Rick Deckard, personnage emblématique créé par Philip K. Dick, je suis donc parti en chasse du vilain bug de RevSlider. Comme indiqué dans l’erreur fatale, j’ai donc ouvert le fichier /path/to/worpress/wp-content/plugins/revslider/inc_php/framework/base_admin.class.php
. Toujours en suivant les indications de l’erreur, je me suis ensuite rendu ligne 72 :
self::$arrMetaBoxes[] = $box;
La variable $arrMetaBoxes[] est donc un tableau. Or, ligne 23, cette variable est déclarée ainsi :
private static $arrMetaBoxes = ""; //option boxes that will be added to post
Et oui, tragique erreur de développement : une chaîne de caractères qui se transforme par magie en tableau. Pas sérieux tout ça. 😛
Vous l’aurez sans doute compris, il m’a suffit de remplacer la ligne 23 ci-dessus par :
private static $arrMetaBoxes = []; //option boxes that will be added to post
Et le tour était joué !
Pour conclure
Comme vous l’aurez constaté, il suffit parfois d’un rien pour générer une erreur 500. Dans tous les cas, les fichiers journaux sont une mine d’information pour résoudre ce genre de problème. Bien entendu, la plupart du temps il vous faudra mettre les mains dans le cambouis. Heureusement, la résolution est souvent relativement simple pour peu que l’on lise correctement le message d’erreur.
Bonjour,
J’ai un problème similaire, après un updated php 7.3.
Après la désactivation des plugins impossible de réactiver revslider.
Fatal error: Uncaught Error: [] operator not supported for strings in /srv/data/web/vhosts/aquatile.fr/htdocs/wp-content/plugins/revslider/includes/framework/base-admin.class.php:71 Stack trace: #0 /srv/data/web/vhosts/aquatile.fr/htdocs/wp-content/plugins/revslider/admin/revslider-admin.class.php(572): RevSliderBaseAdmin::addMetaBox(‘Revolution Slid…’, », Array, NULL) #1 /srv/data/web/vhosts/aquatile.fr/htdocs/wp-content/plugins/revslider/admin/revslider-admin.class.php(73): RevSliderAdmin->addSliderMetaBox() #2 /srv/data/web/vhosts/aquatile.fr/htdocs/wp-content/plugins/revslider/admin/revslider-admin.class.php(44): RevSliderAdmin->init() #3 /srv/data/web/vhosts/aquatile.fr/htdocs/wp-content/plugins/revslider/revslider.php(165): RevSliderAdmin->__construct(‘/srv/data/web/v…’) #4 /srv/data/web/vhosts/aquatile.fr/htdocs/wp-admin/includes/plugin.php(2050): include(‘/srv/data/web/v…’) #5 /srv/data/web/vhosts/aquatile.fr/htdocs/wp-admin/plugins.php(175): plugin_sandbox_scrape(‘revslider/revsl…’) #6 {main} thrown in /srv/data/web/vhosts/aquatile.fr/htdocs/wp-content/plugins/revslider/includes/framework/base-admin.class.php on line 71
Une idée ? Merci
Bonjour,
Avez-vous essayé de corriger la ligne incriminée comme indiqué dans la partie du billet « Correction de l’extension RevSlider » ?
Bonjour,
Hélas le code et moi ça fait deux 🙁 donc je ne préfère pas faire de modification à l’aveugle.
Je ne sais pas si cela vient de ma nouvelle version php ou de la dernière version de wordpress.
Je vais repasser à l’ancienne version wp ça me parrait plus dans mes cordes.
Merci quand même
Bonjour ,
Finalement j’ai fait la modification et ça fonctionne.
Merci pour le post
François
Ravi d’avoir pu vous être utile. 🙂
Bonne continuation.
Juan
Merci pour ce coup de main !!!
Effectivement, les fichiers logs….
Encore merci
Merci François, génial Pour l’instant j’ai juste changé la version PHP et je peux rentrer dans l’admin à nouveau. Mais je mets votre lien en bookmark. On ne remercie jamais assez toutes les infos super sympas que l’on trouve et qui nous font gagner du temps.
Top.
Merci beaucoup !
Merci beaucoup ! Cela ma permet d’éviter de m’arracher le peu de cheveux qu’il me reste !