2026年10月14日

2026年10月14日

WordPressのプラグイン更新エラーを解決する方法

はじめに

WordPressの管理画面でプラグインを更新しようとすると「更新に失敗しました。ダウンロードのインストール中にエラーが発生しました」と表示される・プラグインを更新したらPHPエラーが発生してサイトが白画面になった・自動更新が有効なのに更新されていない・古いバージョンに戻したいのにWordPressには公式のロールバック機能がないといった問題は、WordPressの更新システムの仕組みと安全な更新手順を理解することで解決できます。

症状・原因

  • サーバーのファイルシステム権限が適切でなく、プラグインファイルへの書き込みができない
  • WP_TEMP_DIR(一時ディレクトリ)の空き容量不足またはパーミッションエラーで解凍・移動に失敗する
  • プラグインの新バージョンが現在のPHPバージョンやWordPressバージョンと非互換
  • ファイアウォールまたはホスティング設定がWordPressのアップデートサーバー(api.wordpress.org)への接続をブロックしている

解決手順

ステップ1:更新エラーを診断する

# 更新可能なプラグインを確認
wp plugin list --update=available

# 特定プラグインを更新(エラーを確認)
wp plugin update akismet --debug

# WordPress.org への接続テスト
wp eval "
\$response = wp_remote_get('https://api.wordpress.org/plugins/info/1.2/');
echo 'Status: ' . wp_remote_retrieve_response_code(\$response) . PHP_EOL;
"

# 一時ディレクトリを確認
wp eval "
echo 'Temp dir: ' . get_temp_dir() . PHP_EOL;
echo 'Writable: ' . (is_writable(get_temp_dir()) ? 'yes' : 'no') . PHP_EOL;
echo 'Free space: ' . size_format(disk_free_space(get_temp_dir())) . PHP_EOL;
"

# ファイルシステム権限を確認
wp eval "
\$creds = request_filesystem_credentials('');
WP_Filesystem(\$creds);
global \$wp_filesystem;
echo 'Method: ' . get_filesystem_method() . PHP_EOL;
"

ステップ2:更新エラーを修正する

// ✅ wp-config.php でファイルシステムの直接アクセスを強制
// define('FS_METHOD', 'direct');  // FTPの資格情報入力をスキップ

// ✅ 一時ディレクトリを変更
// define('WP_TEMP_DIR', '/tmp/');

// ✅ 更新タイムアウトを延長
add_filter('http_request_timeout', function(int $timeout): int {
    return max($timeout, 300); // 5分に延長
});

// ✅ 更新時のメモリ制限を引き上げ
add_filter('admin_memory_limit', function(): string {
    return '512M';
});
# ✅ WP-CLI で強制更新(サーバー直接)
wp plugin update --all --force

# 特定バージョンをインストール(ロールバック)
wp plugin install akismet --version=5.0 --force

# WordPress.org から zip を直接インストール
wp plugin install https://downloads.wordpress.org/plugin/akismet.5.0.zip --force

ステップ3:更新後の問題をロールバックする

# ✅ 旧バージョンへのロールバック(WP-CLI)
# WordPress.org から特定バージョンをダウンロードして強制上書き
wp plugin install contact-form-7 --version=5.7.7 --force

# ✅ バックアップから復元(ファイルのみ)
# FTP/SSH で wp-content/plugins/{plugin-name}/ を旧バージョンに置き換え

# ✅ データベースも含めた完全ロールバック(UpdraftPlus等のバックアッププラグイン)
# 管理画面 > UpdraftPlus > バックアップを復元

# 更新後のプラグインバージョンを確認
wp plugin list --fields=name,version,update_version
// ✅ 更新前にバックアップを自動作成するフック
add_action('upgrader_pre_install', function(bool|WP_Error $response, array $hook_extra): void {
    if (!isset($hook_extra['plugin'])) {
        return;
    }

    $plugin_dir = WP_PLUGIN_DIR . '/' . dirname($hook_extra['plugin']);
    if (!is_dir($plugin_dir)) {
        return;
    }

    // プラグインディレクトリを zip に圧縮してバックアップ
    $backup_dir  = WP_CONTENT_DIR . '/plugin-backups/';
    $plugin_name = basename($plugin_dir);
    $backup_file = $backup_dir . $plugin_name . '-backup-' . date('Ymd-His') . '.zip';

    if (!is_dir($backup_dir)) {
        wp_mkdir_p($backup_dir);
    }

    $zip = new ZipArchive();
    if ($zip->open($backup_file, ZipArchive::CREATE) === true) {
        $iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($plugin_dir, RecursiveDirectoryIterator::SKIP_DOTS)
        );
        foreach ($iterator as $file) {
            $zip->addFile($file->getPathname(), str_replace($plugin_dir . '/', '', $file->getPathname()));
        }
        $zip->close();
    }
}, 10, 2);

ステップ4:自動更新を安全に管理する

// ✅ 特定プラグインの自動更新を無効化
add_filter('auto_update_plugin', function(bool $update, object $item): bool {
    // セキュリティプラグインは自動更新を許可
    $auto_update_allowed = ['akismet', 'wordfence'];
    // その他は無効化
    $plugin_slug = $item->slug ?? '';
    return in_array($plugin_slug, $auto_update_allowed, true);
}, 10, 2);

// ✅ 全プラグインの自動更新を有効化
add_filter('auto_update_plugin', '__return_true');

// ✅ 更新完了後にメール通知
add_action('automatic_updates_complete', function(array $results): void {
    if (empty($results['plugin'])) {
        return;
    }

    $updated = [];
    foreach ($results['plugin'] as $result) {
        if ($result->result === true) {
            $updated[] = $result->name . ' (' . $result->new_version . ')';
        }
    }

    if ($updated) {
        wp_mail(
            get_option('admin_email'),
            'プラグイン自動更新完了: ' . get_bloginfo('name'),
            '以下のプラグインが更新されました:' . PHP_EOL . implode(PHP_EOL, $updated)
        );
    }
});

ステップ5:更新の互換性チェックを自動化する

// ✅ 更新前にPHPバージョン互換性を確認
add_filter('upgrader_pre_download', function(bool $reply, string $package, object $upgrader): bool {
    // プラグイン情報からPHP要件を取得
    if (!isset($upgrader->skin->plugin_info)) {
        return $reply;
    }

    $info         = $upgrader->skin->plugin_info;
    $requires_php = $info['RequiresPHP'] ?? '';

    if ($requires_php && version_compare(PHP_VERSION, $requires_php, '<')) {
        $upgrader->skin->feedback(sprintf(
            'このプラグインには PHP %s 以上が必要です(現在: PHP %s)',
            $requires_php,
            PHP_VERSION
        ));
        return new WP_Error('php_version', 'PHPバージョン不足');
    }

    return $reply;
}, 10, 3);

// ✅ ステージング環境で先に更新テスト
// WP_ENVIRONMENT_TYPE を使って環境を判別
add_filter('auto_update_plugin', function(bool $update): bool {
    // ステージング・開発環境では自動更新を無効化
    return wp_get_environment_type() === 'production';
});

注意事項

  • プラグインを更新する前に必ずデータベースとファイルのバックアップを取得してください。特にEコマースプラグイン(WooCommerce)やページビルダー(Elementor、Divi)は更新でデータベーススキーマが変更される場合があり、ロールバックにはデータベースの復元も必要になります
  • FS_METHOD = 'direct'を設定するとWordPressがFTPを使わずファイルシステムに直接書き込みます。セキュリティ上、wp-config.phpに書くのではなく、サーバーのPHPプロセスがwebサーバーの所有者と同一ユーザーで動作している場合のみ使用してください

まとめ

WordPressのプラグイン更新エラーの解決は①wp plugin update --debugでエラー確認・api.wordpress.orgへの接続テスト・一時ディレクトリの空き容量確認・get_filesystem_method()でファイルシステム確認、②FS_METHOD:directでFTP不要化・http_request_timeout延長・wp plugin install --version=X --forceで特定バージョン強制インストール、③wp plugin install --version=旧バージョン --forceでロールバック・upgrader_pre_installフックで更新前バックアップを自動作成、④auto_update_pluginフィルターでプラグインごとに自動更新を制御・automatic_updates_completeフックで更新完了メール通知、⑤upgrader_pre_downloadでPHPバージョン互換チェック・wp_get_environment_type()でステージング環境では自動更新を無効化の手順で解決します。

お気軽にご相談ください

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