WordPressのPHPファイルで発生するParse error: syntax errorの修正方法

beginner📝 WordPress2026-03-18| WordPress 5.x–6.x, PHP 7.4–8.3, Apache/Nginx, Linux/Windows

Error Message

Parse error: syntax error, unexpected '}' in /path/to/wordpress/wp-content/plugins/my-plugin/my-plugin.php on line X
#wordpress#php#構文エラー#解析エラー

エラーの内容

プラグインまたはテーマファイルを編集して保存し、サイトを更新したら、真っ白な画面またはこんなエラーが表示されるようになった場合:

Parse error: syntax error, unexpected '}' in /path/to/wordpress/wp-content/plugins/my-plugin/my-plugin.php on line X

他のバリエーションとして unexpected '{'unexpected 'T_STRING'unexpected end of file などがあります。トークンは違っても根本的な原因は同じです:構文が壊れているためPHPがファイルを解析できないのです。

実際に何が起きているのか

PHPは何かを実行する前にファイルの全行を解析します。どこかに構文エラーが1つでもあると、完全に停止します — 部分的な実行もフォールバックもありません。

多くの人が引っかかるのはここです:エラーの行番号はPHPが問題を検出した場所であって、必ずしもミスをした場所ではありません。23行目のセミコロン欠落が31行目のエラーとして表れることもあります。

よくある原因:

  • 行末のセミコロン欠落
  • 波括弧 {} または括弧 () の対応がとれていない
  • 文字列が閉じられていない(閉じクォートの欠落)
  • WordまたはGoogle Docsからコードをコピーする際に「スマートクォート」が入り込んでいる
  • PHPバージョンの不一致 — 例:PHP 7.3で動くサーバーで match() を使用している
  • コードの構造を壊してしまったコピー&ペースト

緊急対処:まずサイトをオンラインに戻す

サイトがダウンしている場合、当てずっぽうにデバッグを始めないでください。まずアクセスを回復させてから、バグを修正しましょう。

方法1:FTP/SSH経由で壊れたファイルをリネームする

問題のファイルをリネームして、WordPressが読み込まないようにします:

# SSHで実行
mv wp-content/plugins/my-plugin/my-plugin.php wp-content/plugins/my-plugin/my-plugin.php.bak

これでプラグインが即座に無効化されます。壊れたファイルがテーマにある場合は、テーマフォルダ全体をリネームしてください — WordPressは自動的にデフォルトテーマにフォールバックします。

方法2:データベース経由でプラグインを無効化する

ファイルシステムにアクセスできない場合は、phpMyAdminから操作するか、このSQLを直接実行してください:

-- 有効なプラグインを確認
SELECT option_value FROM wp_options WHERE option_name = 'active_plugins';

-- 全プラグインを一括無効化(最終手段)
UPDATE wp_options SET option_value = 'a:0:{}' WHERE option_name = 'active_plugins';

強引な方法ですが、有効なプラグインをすべて一度に無効化します。これでwp-adminが再び動作するようになり、きちんと修正できます。

方法3:WP-CLI

wp plugin deactivate my-plugin --skip-plugins --skip-themes

実際のバグを見つける

サイトが復旧したら、壊れたファイルを開いてエラーの行番号にジャンプします。そしてその1〜2行上を確認してください — 実際のミスはそこに隠れていることがほとんどです。

PHPの組み込みリンター

PHPファイルをアップロードする前にこれを実行してください:

php -l wp-content/plugins/my-plugin/my-plugin.php

正常なファイル:

No syntax errors detected in my-plugin.php

壊れたファイル:

Parse error: syntax error, unexpected '}' in my-plugin.php on line 47
Errors parsing my-plugin.php

1秒もかかりません。FTPでの試行錯誤を大幅に減らすことができます。

確認すべき一般的なパターン

セミコロンの欠落:

// 壊れたコード
$price = get_post_meta($post_id, 'price', true)
echo $price;

// 修正後
$price = get_post_meta($post_id, 'price', true);
echo $price;

波括弧の対応がとれていない:

// 壊れたコード — 波括弧が2つ開いているのに1つしか閉じていない
function my_function() {
    if ($condition) {
        do_something();
}

// 修正後
function my_function() {
    if ($condition) {
        do_something();
    }
}

閉じられていない文字列:

// 壊れたコード
$message = "Hello, world;
echo $message;

// 修正後
$message = "Hello, world";
echo $message;

コピー&ペーストによるスマートクォート:

// 壊れたコード — “” はPHPの文字列区切り文字として無効
$key = “my_option_key”;

// 修正後
$key = "my_option_key";

恒久的な修正ワークフロー

ライブファイルを直接編集することが、そもそもこの問題の原因です。今すぐやめましょう。

1. ローカル開発環境を使う

# LocalWP、XAMPP、またはDocker
# ローカルで編集し、テストして、動作確認後にデプロイする

2. エディタにPHPリンティングを追加する

VS Code:PHP Intelephense または PHP CS Fixer をインストールしてください。どちらもリアルタイムで構文エラーを強調表示します — ファイルを保存する前でも確認できます。

3. プレコミットリントフック(Gitを使用している場合)

# .git/hooks/pre-commit
#!/bin/bash
for file in $(git diff --cached --name-only | grep \.php$); do
    php -l "$file"
    if [ $? -ne 0 ]; then
        echo "PHP構文エラーが $file に存在します — コミットを中止します"
        exit 1
    fi
done

4. ステージング環境でのみWP_DEBUGを有効にする

ステージング環境の wp-config.php にこれを追加してください — 本番環境には絶対に追加しないでください:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

エラーはフロントエンドに表示される代わりに wp-content/debug.log に書き込まれます。

修正を確認する

  • php -l your-file.php を実行 — 「No syntax errors detected」と表示されることを確認
  • wp-admin → プラグインからプラグインを再有効化する
  • サイトにアクセス — 白い画面もパースエラーも表示されない
  • 残存するPHP警告がないか wp-content/debug.log を確認する

エラーが繰り返し発生する場合

構文が正しく見えてもエラーが続く場合、FTP転送の失敗によってファイルが破損している可能性があります。バイナリモードに切り替えてください:

# FTPクライアント:転送モードをバイナリに設定する
# さらに良いのはSCPやSFTPを使うこと — ファイル内容を一切変更しない

また、サーバーのPHPバージョンがプラグインの要件と一致していることを確認してください。名前付き引数や match() 式を使用するPHP 8.0+向けのプラグインは、PHP 7.xのサーバーでパースエラーをスローします。

# PHPバージョンを確認
php -v

# またはWordPressで確認
wp eval 'echo PHP_VERSION;'

Related Error Notes