Le WordPress d'aujourd'hui, décodé pour les développeurs

Erreurs WordPress · Erreurs PHP et écran blanc

Parse error: syntax error, unexpected… : erreur de syntaxe PHP

Erreur fatale PHP

« Parse error: syntax error, unexpected… » : lisez le message PHP, trouvez le fichier fautif, annulez la modification et contrôlez-le avec php -l.

Message affiché

Parse error: syntax error, unexpected token ";"

En anglais : Parse error: syntax error, unexpected token ";"

Réponse rapide

PHP n’a pas pu lire un fichier à cause d’une faute de syntaxe (point-virgule, accolade ou guillemet manquant). Ouvrez le fichier et la ligne indiqués dans le message, annulez la dernière modification, puis vérifiez avec php -l.

Juste après avoir collé un extrait de code dans functions.php, enregistré un fichier de thème ou mis à jour une extension, votre site affiche une ligne du type « Parse error: syntax error, unexpected token "}" in /…/functions.php on line 42 », ou bien la page d’erreur critique, ou encore une page blanche. Selon le fichier fautif, le site public, l’administration ou les deux sont inaccessibles.

Cette erreur est la plus facile à diagnostiquer, car PHP vous donne le fichier et la ligne. Elle signifie que le code est mal écrit : il n’a pas pu être lu, donc rien de ce fichier ne s’est exécuté.

Ce que signifie cette erreur

Avant d’exécuter un fichier PHP, le moteur le découpe en éléments (les « tokens ») et vérifie la grammaire du langage. Si le découpage échoue, il s’arrête avec une erreur de type E_PARSE. Le texte « unexpected token » signale que PHP a rencontré un élément à un endroit où il n’en attendait pas ; la fin du message précise parfois ce qu’il attendait (expecting ";", par exemple). Il ne s’agit pas d’un message WordPress, et il n’est donc pas traduit.

WordPress sait intercepter cette erreur : E_PARSE figure dans la liste des erreurs gérées par wp-includes/class-wp-fatal-error-handler.php, qui affiche alors la page d’erreur critique et, si le fautif est une extension ou un thème, le met en pause. Ce gestionnaire n’est cependant actif qu’une fois WordPress chargé : une faute dans wp-config.php ou dans un fichier chargé avant lui n’est pas interceptée et produit une page blanche, ou le message brut si l’affichage des erreurs est activé.

Le message varie selon la version de PHP. Depuis PHP 8, il est de la forme unexpected token "}", unexpected variable "$b" ou unexpected end of file. Les versions 7 affichaient unexpected '$b' (T_VARIABLE). PHP 8 a aussi ajouté des messages plus parlants comme Unclosed '{' on line 2 ou Unmatched '}'.

Diagnostic rapide

Symptôme / constatCause probableÀ vérifier
unexpected variable "$b" sur une ligne qui commence par une variablePoint-virgule oublié à la ligne précédenteLa ou les lignes juste avant celle indiquée
unexpected end of file ou Unclosed '{'Accolade, parenthèse ou guillemet non ferméLa fin du fichier ; compter les { et }
Unmatched '}'Accolade fermante en tropLe bloc situé juste avant la ligne
Erreur à la ligne 1 d’un fichier qui semble correctMarque BOM ou encodage altéré par un transfert FTPDébut du fichier en hexadécimal ; mode de transfert FTP
Erreur après avoir copié un extrait depuis une page webGuillemets typographiques ou espaces insécables collésRemplacer par des guillemets droits ' et "
Erreur après un changement de version de PHPSyntaxe trop récente pour votre version, ou obsolèteVersion de PHP (Santé du site), documentation de l’extension

Les causes les plus fréquentes

  1. Un extrait de code collé dans functions.php ou un snippet, incomplet ou mal copié (accolade finale oubliée, guillemets typographiques).
  2. Un point-virgule, une virgule ou une parenthèse manquants après une modification à la main.
  3. Un fichier tronqué ou altéré par un téléversement interrompu, un transfert FTP en mode texte ou une marque BOM (voir l’article Parse error après un import FTP mal encodé).
  4. Une syntaxe incompatible avec la version de PHP : fonction fléchée (fn), match, opérateur ?-> ou types union sur un PHP ancien.
  5. Une mise à jour d’extension interrompue, qui laisse un fichier à moitié écrit.
  6. Des balises PHP mal fermées (?> suivi de code, ou balise courte <? désactivée) dans un gabarit de thème.

Solutions pas à pas

Avant toute manipulation, copiez le fichier concerné (ou sauvegardez wp-content/). Du moins invasif au plus technique :

1. Lire le message jusqu’au bout

Notez trois informations : le chemin du fichier, le numéro de ligne et le début du message. Si vous ne voyez rien à l’écran parce que l’affichage des erreurs est désactivé, récupérez-les dans l’e-mail du mode de récupération (« Votre site connaît un problème technique ») ou dans le journal :

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
tail -n 20 wp-content/debug.log

Ces trois lignes se placent dans wp-config.php, au-dessus de « That’s all, stop editing! » (détails dans notre article sur WP_DEBUG_LOG). Retirez-les ensuite. Gardez en tête que PHP signale la ligne où il a compris qu’il y avait un problème : la vraie faute se trouve souvent une ou deux lignes plus haut.

2. Utiliser le mode de récupération

Si la faute est dans une extension ou un thème et que vous avez reçu l’e-mail du mode de récupération, ouvrez son lien, connectez-vous, puis désactivez l’extension ou le thème, ou corrigez-le. La marche à suivre complète figure dans la fiche sur l’erreur critique de WordPress.

3. Annuler la dernière modification

Le plus rapide est de revenir à l’état précédent. Connectez-vous en SFTP (ou via le gestionnaire de fichiers de l’hébergeur), ouvrez le fichier cité et supprimez ou commentez le code que vous venez d’ajouter. Si vous avez perdu l’accès SFTP et que l’éditeur de fichiers est désactivé, consultez l’article éditeur de code désactivé : réactiver en urgence. Pour une extension, remplacez simplement son dossier par une copie saine :

wp plugin install nom-de-l-extension --force
wp theme install nom-du-theme --force

Cette commande réinstalle la version publiée sur wordpress.org ; elle n’est utile que pour les extensions et thèmes de ce dépôt. Les réglages, stockés en base, sont conservés, mais toute modification que vous aviez faite dans les fichiers est perdue.

4. Vérifier la syntaxe avec php -l

Une fois le fichier corrigé, testez-le avant de recharger le site. L’option -l (lint) lit le fichier sans l’exécuter :

php -l wp-content/themes/mon-theme/functions.php

La réponse « No syntax errors detected in … » confirme que la syntaxe est valide ; sinon PHP affiche la même erreur qu’à l’écran. Pour parcourir un dossier entier (utile après un transfert massif) :

find wp-content -name '*.php' -print0 | xargs -0 -n1 php -l 2>&1 | grep -v 'No syntax errors'

Attention : si plusieurs versions de PHP sont installées, le php de la ligne de commande n’est pas forcément celui du site. Utilisez le binaire correspondant (par exemple php8.2).

5. Corriger les caractères invisibles et l’encodage

Si le fichier paraît correct, regardez ses premiers octets : une marque BOM (ef bb bf) ou des guillemets typographiques collés en sont les coupables habituels.

head -c 16 wp-content/themes/mon-theme/functions.php | xxd
file wp-content/themes/mon-theme/functions.php

Réenregistrez le fichier en « UTF-8 sans BOM » dans votre éditeur, et remplacez les guillemets courbes « “ ” ‘ ’ » du code par des guillemets droits. Lors d’un transfert FTP, utilisez le mode binaire (ou SFTP).

6. Adapter la version de PHP

Si l’erreur est apparue après un changement de version de PHP, ou si une extension récente exige PHP 8, vérifiez la version utilisée dans Outils > Santé du site > Info > Serveur. Dans le panneau de l’hébergeur, changez la version de PHP du site (revenez en arrière en urgence, puis planifiez la montée de version sur un double du site). Quand la faute vient de fichiers du cœur, restaurez-les :

wp core verify-checksums
wp core download --force --skip-content

Ces deux commandes comparent puis remplacent les fichiers du cœur sans toucher à wp-content/, à wp-config.php ni à la base.

Sans accès à l’administration

Tout se fait par SFTP, par le gestionnaire de fichiers de l’hébergeur ou en SSH avec WP-CLI. Si l’erreur est dans wp-config.php, comparez-le avec votre sauvegarde ou avec wp-config-sample.php et testez-le avec php -l wp-config.php avant de rouvrir le site. Une sauvegarde récente vous évite tout cela : voir sauvegardes et plan de reprise.

Prévenir l’erreur

  • Ne modifiez pas le code en production : travaillez en local ou sur un double du site, et déployez par Git ou SFTP.
  • Utilisez un éditeur avec coloration et contrôle syntaxique (ou lancez php -l automatiquement avant chaque envoi).
  • Préférez une extension de snippets à l’édition directe de functions.php : elle teste le code avant de l’activer.
  • Testez les mises à jour de PHP sur un double, extension par extension, avant la bascule.
  • Gardez une sauvegarde récente des fichiers, restaurable en quelques minutes.

Questions fréquentes

Pourquoi la ligne indiquée semble-t-elle correcte ?

PHP signale l’endroit où il comprend qu’il y a un problème, pas toujours celui de la faute. Regardez les lignes précédentes (point-virgule ou accolade manquants), et, si la ligne est la première, un caractère invisible comme un BOM.

Je ne peux plus accéder à l’administration, comment corriger ?

Passez par SFTP ou le gestionnaire de fichiers de l’hébergeur : annulez la modification dans le fichier cité, ou renommez le dossier de l’extension dans wp-content/plugins/ pour la désactiver.

Quelle différence avec une erreur critique ?

« Parse error » est la cause technique : PHP n’a pas pu lire le fichier. La page « Il y a eu une erreur critique » est l’affichage que WordPress propose quand il intercepte cette erreur (ou une autre erreur fatale).

L’erreur concerne un fichier de WordPress lui-même, que faire ?

Restaurez le cœur avec wp core download --force --skip-content, après avoir vérifié la version de PHP : un cœur récent peut exiger une version plus élevée que celle de votre hébergement.