2026年6月2日
2026年6月2日
WordPressのアップデートが失敗する問題を解決する方法
はじめに
WordPressの「今すぐ更新」ボタンを押してもアップデートが途中で止まりサイトがメンテナンスモードのまま復帰しない・「別の更新が進行中です。しばらく待ってから再度お試しください。」エラーが何時間経っても消えない・プラグインの更新時に「FTPの認証情報を入力してください」のダイアログが毎回表示される・自動アップデートがメール通知は来るのに実際には更新されていないといった問題は、.maintenanceファイルの残留・ファイルシステム権限の問題・ロックファイルの競合が原因です。
症状・原因
- アップデート中にタイムアウトまたはサーバーエラーが発生し
.maintenanceファイルが削除されずに残った wp-content/ディレクトリの所有者がWebサーバーユーザー(www-data等)でないためファイルを上書きできないupdate_coreオプションにロックが残っておりWordPressが「更新中」と誤認している- PHPの
memory_limitやmax_execution_timeが小さく大きなプラグインの更新に失敗する
解決手順
ステップ1:アップデート失敗の原因を診断する
# .maintenanceファイルの存在確認
wp eval "
\$maintenance = ABSPATH . '.maintenance';
if (file_exists(\$maintenance)) {
echo '.maintenance file EXISTS!' . PHP_EOL;
echo 'Created: ' . date('Y-m-d H:i:s', filemtime(\$maintenance)) . PHP_EOL;
echo 'Content: ' . file_get_contents(\$maintenance) . PHP_EOL;
} else {
echo '.maintenance file: not found (OK)' . PHP_EOL;
}
"
# アップデートロックを確認
wp eval "
\$lock = get_option('core_updater.lock');
echo 'core_updater.lock: ' . (\$lock ? \$lock . ' (LOCKED)' : 'not set') . PHP_EOL;
\$update = get_site_transient('update_core');
echo 'update_core transient: ' . (\$update ? 'exists' : 'not set') . PHP_EOL;
"
# ファイル権限を確認
wp eval "
\$paths = [ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, get_template_directory()];
foreach (\$paths as \$path) {
echo substr(sprintf('%o', fileperms(\$path)), -4) . ' ' . \$path . PHP_EOL;
}
"
ステップ2:メンテナンスモードを解除してアップデートをリセットする
# .maintenanceファイルを削除
wp eval "
\$maintenance = ABSPATH . '.maintenance';
if (file_exists(\$maintenance)) {
unlink(\$maintenance);
echo '.maintenance file deleted.' . PHP_EOL;
} else {
echo 'No .maintenance file found.' . PHP_EOL;
}
"
# アップデートロックをクリア
wp eval "
delete_option('core_updater.lock');
delete_option('auto_updater.lock');
delete_site_transient('update_core');
delete_site_transient('update_plugins');
delete_site_transient('update_themes');
wp_version_check(); // アップデートチェックを再実行
wp_update_plugins();
wp_update_themes();
echo 'Update locks cleared and checks triggered.' . PHP_EOL;
"
ステップ3:FTP認証を不要にするファイルシステム設定
// wp-config.php: FTP認証ダイアログを表示しない設定
// ① Webサーバーが直接書き込める場合(推奨)
define('FS_METHOD', 'direct');
// ② FTPが必要な場合(推奨しない)
// define('FTP_HOST', 'ftp.example.com');
// define('FTP_USER', 'ftpuser');
// define('FTP_PASS', 'ftppassword');
// ③ SSH FTP(SFTP)を使用する場合
// define('FS_METHOD', 'ssh2');
// define('FTP_PUBKEY', '/home/user/.ssh/id_rsa.pub');
// define('FTP_PRIKEY', '/home/user/.ssh/id_rsa');
# Webサーバーがwp-contentに書き込めるよう権限を修正
# chown -R www-data:www-data /var/www/html/wp-content/
# find /var/www/html/ -type d -exec chmod 755 {} \;
# find /var/www/html/ -type f -exec chmod 644 {} \;
# FS_METHODの確認
wp eval "
echo 'FS_METHOD: ' . (defined('FS_METHOD') ? FS_METHOD : 'not defined') . PHP_EOL;
\$method = get_filesystem_method();
echo 'Detected filesystem method: ' . \$method . PHP_EOL;
"
ステップ4:自動アップデートの設定を最適化する
// wp-config.php または functions.php: 自動アップデートの制御
// コアの自動アップデートを有効化(マイナーバージョンのみ)
define('WP_AUTO_UPDATE_CORE', 'minor'); // 'true', 'false', 'minor'
// functions.php: プラグインの自動アップデートを選択的に有効化
add_filter('auto_update_plugin', function(bool $update, object $item): bool {
// セキュリティ重要プラグインのみ自動更新
$auto_update_plugins = [
'wordfence/wordfence.php',
'akismet/akismet.php',
'jetpack/jetpack.php',
];
return in_array($item->plugin, $auto_update_plugins, true) ? true : $update;
}, 10, 2);
// テーマの自動アップデートを無効化(カスタマイズしている場合)
add_filter('auto_update_theme', '__return_false');
// 自動アップデートの完了メールを制御
add_filter('auto_core_update_send_email', function(bool $send, string $type): bool {
// 失敗時のみメールを送信(成功は静かに)
return $type === 'fail' || $type === 'critical';
}, 10, 2);
ステップ5:WP-CLIで安全にアップデートを実行する
# WP-CLIで現在のバージョンと利用可能な更新を確認
wp core check-update
wp plugin list --update=available --format=table
wp theme list --update=available --format=table
# コアを更新(--force で強制上書き)
wp core update
wp core update-db
# プラグインを個別に更新
wp plugin update akismet
wp plugin update --all
# テーマを更新
wp theme update --all
# 更新後にキャッシュをクリア
wp cache flush
wp rewrite flush
# 更新後のサイト動作確認
wp eval "
echo 'WordPress version: ' . get_bloginfo('version') . PHP_EOL;
echo 'Site URL: ' . get_bloginfo('url') . PHP_EOL;
echo 'Admin Email: ' . get_bloginfo('admin_email') . PHP_EOL;
"
注意事項
.maintenanceファイルを削除してもアップデートが中途半端な状態の場合、サイトが正常に動作しないことがあります。必ずwp core updateを再実行して完全な状態に更新してくださいdefine('FS_METHOD', 'direct')を設定する前に、Webサーバープロセス(www-data等)がWordPressファイルを所有していることを確認してください。所有者が異なる状態でdirectを設定するとアップデートが失敗します- 本番環境のアップデート前には必ずバックアップを取得してください。特にコアとデータベースのバックアップは必須です
まとめ
WordPressアップデート失敗の解決は①.maintenanceファイルの存在・作成日時を確認・core_updater.lockオプションのロック状態確認・wp-content/のファイル権限確認、②.maintenanceファイルをunlink()で削除・delete_option('core_updater.lock')でロックをクリア・delete_site_transientでキャッシュをリセットして再チェックを実行、③wp-config.phpにFS_METHOD=directを定義・FTP不要な場合はWebサーバーユーザーにファイル所有権を付与・get_filesystem_method()で検出値を確認、④WP_AUTO_UPDATE_CORE=minorでマイナー更新のみ自動化・auto_update_pluginフィルターでセキュリティプラグインのみ自動更新・auto_core_update_send_emailで失敗時のみ通知、⑤wp core update・wp plugin update --allでWP-CLIから安全に更新・更新後にwp cache flushとwp rewrite flushでリセットの手順で解決します。