2026年9月25日

2026年9月25日

WordPressの白い画面(WSOD)を解決する方法

はじめに

WordPressサイトにアクセスすると何も表示されない真っ白なページが表示される(WSOD: White Screen of Death)・管理画面も真っ白でどこにもアクセスできない・特定のプラグインを有効化した直後から白画面になった・テーマをアップデートした後からサイトが真っ白になったといった問題は、PHPのFatalエラー・メモリ不足・プラグインやテーマのPHPコード上のバグが原因で、エラーが画面に表示されずに白い画面になります。

症状・原因

  • サイトにアクセスすると何も表示されないHTTP 200の空白ページが返る
  • PHPのFatal errorやparse errorが発生しているがWP_DEBUGが無効で画面に表示されない
  • プラグインまたはテーマのPHPファイルに構文エラーがある
  • メモリ制限に達してスクリプトが強制終了している

解決手順

ステップ1:WP_DEBUGを有効化してエラーを確認する

// wp-config.php: デバッグモードを有効化
define('WP_DEBUG',         true);   // デバッグ有効化
define('WP_DEBUG_LOG',     true);   // /wp-content/debug.log に記録
define('WP_DEBUG_DISPLAY', false);  // 画面には表示しない(本番環境)
define('SCRIPT_DEBUG',     true);   // 圧縮されていないJS/CSSを使用
# debug.logを確認
tail -50 /var/www/html/wp-content/debug.log

# PHPエラーログを確認
tail -50 /var/log/php/error.log
tail -50 /var/log/apache2/error.log

# WP-CLIでエラーを確認
wp eval "error_reporting(E_ALL); echo 'PHP version: ' . PHP_VERSION;"

ステップ2:プラグインを無効化して原因を特定する

# すべてのプラグインをWP-CLIで無効化
wp plugin deactivate --all

# サイトが復旧したら1つずつ有効化して原因を特定
wp plugin list --status=inactive --field=name | while read plugin; do
    wp plugin activate "$plugin"
    status=$(wp eval "echo is_wp_error(new WP_Error()) ? 'error' : 'ok';")
    echo "Plugin: $plugin - Status: $status"
done
# FTPでプラグインフォルダをリネーム(管理画面アクセス不可の場合)
# /wp-content/plugins/ → /wp-content/plugins-disabled/
# これでプラグインが一括無効化される

# 個別プラグインの場合
# /wp-content/plugins/problematic-plugin/ → /wp-content/plugins/problematic-plugin.bak/

ステップ3:テーマを切り替えて原因を特定する

# デフォルトテーマに切り替え
wp theme activate twentytwentyfour

# 現在のテーマを確認
wp theme list --status=active

# テーマのPHPファイルに構文エラーがないか確認
php -l /var/www/html/wp-content/themes/my-theme/functions.php
find /var/www/html/wp-content/themes/my-theme/ -name "*.php" -exec php -l {} \; 2>&1 | grep -v "No syntax errors"
// wp-config.php: テーマを強制的に変更(FTPアクセス時)
define('WP_DEFAULT_THEME', 'twentytwentyfour');

ステップ4:PHPエラーを修正する

# 全プラグインとテーマのPHP構文エラーを一括チェック
find /var/www/html/wp-content/plugins/ -name "*.php" -exec php -l {} \; 2>&1 | grep "Parse error\|Fatal error"
find /var/www/html/wp-content/themes/ -name "*.php" -exec php -l {} \; 2>&1 | grep "Parse error\|Fatal error"

# WordPressコアファイルの整合性を確認
wp core verify-checksums

# メモリ不足が原因の場合
wp eval "echo ini_get('memory_limit');"
// functions.php: エラーハンドリングの改善

// ① カスタムエラーハンドラーで詳細なログを記録
set_error_handler(function(int $errno, string $errstr, string $errfile, int $errline): bool {
    if (!(error_reporting() & $errno)) return false;

    $error_types = [
        E_ERROR   => 'ERROR',
        E_WARNING => 'WARNING',
        E_NOTICE  => 'NOTICE',
    ];

    $type = $error_types[$errno] ?? 'UNKNOWN';
    error_log(sprintf('[PHP %s] %s in %s on line %d', $type, $errstr, $errfile, $errline));

    return false;  // PHPのデフォルト処理も実行
});

// ② シャットダウン時のFatalエラーをキャッチ
register_shutdown_function(function(): void {
    $error = error_get_last();
    if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        error_log(sprintf('[Fatal] %s in %s on line %d',
            $error['message'], $error['file'], $error['line']));

        // 管理者に通知
        if (function_exists('wp_mail') && function_exists('get_option')) {
            wp_mail(
                get_option('admin_email'),
                'WordPress Fatal Error',
                sprintf("Fatal Error:\n%s\nFile: %s\nLine: %d",
                    $error['message'], $error['file'], $error['line'])
            );
        }
    }
});

ステップ5:白画面の再発防止設定を実装する

// functions.php: WSOD防止設定

// ① プラグインエラーを検知して自動無効化
add_action('activated_plugin', function(string $plugin): void {
    // プラグイン有効化後にエラーがあれば無効化
    if (is_wp_error($error = validate_plugin($plugin))) {
        deactivate_plugins($plugin);
        error_log('[WSOD Guard] Deactivated problematic plugin: ' . $plugin);

        wp_mail(
            get_option('admin_email'),
            'プラグインエラー検出',
            sprintf('プラグイン "%s" にエラーが検出されたため無効化しました。', $plugin)
        );
    }
});

// ② テーマのfunctions.phpのエラーをキャッチ
add_action('after_setup_theme', function(): void {
    $theme = wp_get_theme();
    if ($theme->errors()) {
        error_log('[WSOD Guard] Theme error: ' . $theme->errors()->get_error_message());
    }
});

// ③ WP_DEBUGを本番環境で安全に有効化
add_action('admin_init', function(): void {
    if (current_user_can('manage_options') && isset($_GET['debug_mode'])) {
        if ($_GET['debug_mode'] === 'on') {
            update_option('_wp_debug_enabled', time());
        }
    }
});

注意事項

  • 本番環境ではWP_DEBUG_DISPLAYをfalseに設定してください。trueにするとエラーメッセージがサイト訪問者にも表示されます。エラーはWP_DEBUG_LOGをtrueにして/wp-content/debug.logに記録し、そのファイルを確認してください
  • WSODはPHPのメモリ不足が原因の場合もあります。エラーログにAllowed memory size exhaustedが記録されていた場合は、メモリ制限(WP_MEMORY_LIMIT)を引き上げるか、メモリを大量消費しているプラグインを特定して最適化してください
  • FTPアクセスができない場合はホスティングの管理画面(cPanel・Pleskなど)からファイルマネージャーを使用してプラグインフォルダをリネームしてください。ほとんどのホスティングサービスにはWebベースのファイルマネージャーが付属しています

まとめ

WordPress WSOD修復は①WP_DEBUG=true・WP_DEBUG_LOG=true・WP_DEBUG_DISPLAY=falseを設定してdebug.logを確認・PHPとApacheのエラーログも確認、②wp plugin deactivate --allで全プラグインを一括無効化・1つずつ有効化して原因プラグインを特定・FTPではplugins フォルダをリネーム、③wp theme activate twentytwentyfourでデフォルトテーマに切り替え・php -lで全PHPファイルの構文エラーをチェック、④set_error_handlerでカスタムログ・register_shutdown_functionでFatalエラーをキャッチしてメール通知、⑤activated_pluginフックでプラグイン有効化時のエラーを自動検知・問題のあるプラグインを自動無効化する手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲