背景
クライアントの本番サイトで定期メンテナンススプリントの最中に、単純なアップデートが壁にぶつかりました。Elementor ProとAdvanced Custom Fields Proの「更新」をクリックするまでは、すべて正常に見えました。しかし、通常のプログレスバーが表示される代わりに、WordPressは無愛想な赤い通知を返してきました。
Update Failed: Download failed. Unauthorized
このエラーは非常に曖昧であることで知られています。サーバーのパーミッションの問題なのか、ファイアウォールによるブロックなのか、あるいはサブスクリプションの状態なのかを特定してくれません。私の経験上、この問題は通常、WordPressのインストール環境とベンダーのアップデートAPI間の通信の不具合に起因します。
デバッグプロセス
コードを触る前に、まずは簡単なところから確認しました。ツール > サイトヘルスをチェックし、サーバーが実際に外部APIにアクセスできることを確認しました。アクセスは可能でした。そこから、プラグインの設定に切り替え、3つの特定の懸念事項(レッドフラグ)を探しました。
- ライセンスの有効性: サブスクリプションが期限切れになっていませんか?たとえ1日の猶予であっても、ベンダーのサーバーから 401 Unauthorized レスポンスが返される原因になります。
- ドメインの不一致: ライセンスが
dev.localやtest.example.comのようなステージング環境に紐付いたまま、本番ドメインでアップデートしようとしていませんか? - 古いTransient(一時データ): WordPressはアップデートのメタデータをデータベースに約12時間キャッシュします。一度APIがリクエストを拒否すると、WordPressはキャッシュされた同じ「Unauthorized」レスポンスを返し続けることがあります。
解決策
1. ライセンスの再同期(解決率90%の方法)
ほとんどのプレミアムデベロッパーは、ドメインを検証するためにトークンベースのシステムを使用しています。そのトークンが期限切れになったり、ハンドシェイクに失敗したりすると、ダウンロードがブロックされます。ElementorやWP Rocketのようなプラグインの場合、素早い「リセット」で解決することがほとんどです。
- プラグインのライセンスまたはアカウント設定ページに移動します。
- Disconnect(切断) または Deactivate License(ライセンスを無効化) をクリックします。
- ダッシュボードをリフレッシュし、Connect & Activate(接続して有効化) をクリックして、ベンダーから新しいAPIトークンを取得します。
2. WordPressのアップデートTransientをクリアする
すでにライセンスを更新したのにエラーが解消されない場合、WordPressがキャッシュされたエラー状態に陥っている可能性があります。サイトにベンダーのサーバーと再度通信させる必要があります。このデータをクリアするには、WP-CLIを使用するのが最も効率的です。
# キャッシュされたすべてのTransientを削除
wp transient delete --all
# WordPressにプラグインの最新データを強制的にチェックさせる
wp plugin update --all --dry-run
コマンドラインに慣れていない場合は、ダッシュボード > 更新 に移動してください。**「もう一度確認」**ボタンをクリックします。これにより、アップデートリストの更新が手動でトリガーされ、データベース内の _site_transient_update_plugins エントリがクリアされます。
3. ベンダーポータルでドメインの不一致を解消する
ベンダーはしばしば、ライセンスを特定のURLに厳密に紐付けています。ステージングサーバーから本番環境に移行した場合、ベンダー側ではまだライセンスが古いアドレスに属していると認識されている可能性があります。elementor.com や wp-rocket.me のアカウントにログインし、「Active Sites(有効なサイト)」リストを確認してください。古いURLが表示されている場合は、それを削除して新しい本番ドメインを承認します。
4. 手動アップデートの実行(緊急時の代替手段)
重大なセキュリティパッチに直面しており、APIがうまく機能しない場合は、自動インストーラーをスキップしてください。手動アップデートでは、ファイルの転送を自分で行うため、「Download failed」エラーを回避できます。
- ベンダーのメンバーエリアから最新の
.zipファイルを直接ダウンロードします。 - プラグイン > 新規追加 > プラグインのアップロード に移動します。
- 新しいバージョンをアップロードします。WordPressが既存のフォルダを認識し、置き換えるかどうかを尋ねてきます。**「現在アップロードされているもので置換」**を選択します。
5. wp-config.php の制限事項を監査する
セキュリティレベルの高い環境や、以前のデベロッパーがサイトのファイル変更や外部呼び出しの機能をロックしている場合があります。wp-config.php ファイルに以下の行がないか確認してください。
// これが true に設定されている場合、UIの更新ボタンが無効になるか失敗します
define( 'DISALLOW_FILE_MODS', false );
// サイトが外部API呼び出しをブロックされていないか確認します
// define( 'WP_HTTP_BLOCK_EXTERNAL', true );
検証
ライセンスを再同期するかTransientをクリアした後、ダッシュボード > 更新 に戻ります。プラグインを選択し、再度アップデートを試してください。修正が成功すると、次のように表示されます。
Downloading update from https://api.vendor.com/...
Unpacking the update...
Installing the latest version...
Plugin updated successfully.
エラーが解消されない場合は、サーバーのPHPエラーログ(/var/log/apache2/error.log または wp-content/debug.log)を確認してください。403 Forbidden エラーが発生している場合は、ホストのファイアウォールがベンダーのIPレンジをブラックリストに登録している可能性があります。
学んだ教訓
- まずはライセンス、次にサーバー: WordPressのエコシステムでは、「Unauthorized」はフォルダのパーミッションよりも、ライセンスの不一致を指していることがほとんどです。
- ステージング環境をクリーンに: ドメインの競合を避けるため、本番環境に移行する前に、必ずステージングサイトでライセンスを無効化してください。
- Transientは「残りやすい」: WordPressはリアルタイムでアップデートをチェックしません。トラブルシューティングの際は、常に「更新」ダッシュボードから強制的にリフレッシュを行ってください。

