WordPressのプラグインが更新できない原因はファイル所有者のズレ|FTPでの解決手順
他社の管理から引き継いだWordPressサイトの定期メンテナンスで、プラグインが管理画面から更新できないという場面に遭遇しました。更新ボタンを押しても失敗し、削除すらできない。原因は、過去のサーバー移行で取り残されたファイル所有者のズレでした。
この状態になると、管理画面から打てる手はほぼありません。解決策は、FTPで問題のフォルダをリネームして、新規インストールとして入れ直すことです。ただし、そこに至るまでに2つの罠がありました。同じ症状で止まっている方のために、原因の特定から解決までの流れを残しておきます。
症状:更新も削除もできない
他社が構築したサイトを保守として引き継ぎ、定期メンテナンスでプラグインの更新をかけたところ、複数のプラグインで更新が失敗しました。
- 「更新」を押しても失敗する
- 「削除」も同様に失敗する
- 特定の1つではなく、複数のプラグインで同じ症状が出る
1つだけ失敗するならプラグイン固有の問題を疑いますが、複数がまとめて失敗する時点で、プラグイン側ではなくファイルシステム側の問題である可能性が高くなります。
原因:ファイルの所有者が現在のPHP実行ユーザーと違っていた
FTPで接続してファイルの所有者を確認したところ、原因がはっきりしました。
問題のプラグインフォルダは、過去のサーバー移行時に使われていたユーザーが所有者のまま残っていました。一方で、現在このサーバーでPHPを実行しているユーザーは別のIDです。
| 対象 | 所有者 |
|---|---|
| 問題のプラグインフォルダ | 移行当時のユーザー |
| 正常なプラグインフォルダ | 現在のPHP実行ユーザー |
Linuxのファイル権限は、所有者・グループ・その他の3区分で設定されます。ディレクトリのパーミッションが755のように「所有者だけに書き込みを許可する」設定になっている場合、所有者以外のユーザーはその中身を書き換えることも、中のファイルを削除することもできません。
WordPressの更新処理はPHP経由で行われるため、PHPの実行ユーザーが書き込めないフォルダは、管理画面から何をしても触れないわけです。パーミッションの考え方はWordPress公式のファイルパーミッション解説にまとまっています。
移行ツール(All-in-One WP Migration)でサイトを展開した際に、当時の実行ユーザーのままファイルが作られ、その後サーバー側の構成が変わったことで所有者がズレたまま取り残された、というのが実態でした。
やっかいなのは、移行そのものは正常に完了しており、サイトは問題なく表示され続けていたことです。プラグインを更新しようとして初めて発覚するタイプの不具合で、逆に言えば更新を試みなければ永遠に気づけません。
回避策:リネームして新規インストール扱いにする
所有者そのものを変更するにはサーバー側での作業が必要ですが、ここで使えるのがLinuxのパーミッションの仕様です。
フォルダ自体を書き換える権限がなくても、親ディレクトリに書き込み権限があればリネーム(移動)はできる
ファイル名の変更は、そのファイル自体ではなく、名前を管理している親ディレクトリへの書き込みにあたります。つまり plugins ディレクトリに書き込み権限さえあれば、中のフォルダの名前は変更できます。これを使って、次の手順を取りました。
- FTPで問題のプラグインフォルダを
プラグイン名_oldにリネームする - WordPressから見ると「プラグインが消えた」状態になる
- 改めて新規インストールする
- 新しく作られたフォルダは、現在のPHP実行ユーザーが所有者になる
以降は通常どおり更新できるようになります。_old フォルダは自分たちでは削除できないため、サーバー管理側で削除してもらいました。放置すると古いバージョンのコードがサーバー上に残り続けるので、必ず削除まで依頼してください。
作業にあたっての注意点は次のとおりです。
- リネームした瞬間にそのプラグインは停止するため、サイトの表示や機能に影響が出る可能性がある。アクセスの少ない時間帯に、再インストール用のzipを用意してから着手する
- プラグインの設定値の多くはデータベース側に保存されているため、フォルダの入れ替えでは基本的に失われない。とはいえ作業前のバックアップは必須
- 再インストール後は、FTPでフォルダの所有者が現在のPHP実行ユーザーになっていることを確認する
バックアップの取得手段が限られているサーバーの場合は、phpMyAdminが使えないWordPressのバックアップ方法もあわせてご覧ください。
なお、この機会に不要なプラグインはリネームのみで終了(再インストールしない)という判断もできます。実質的な棚卸しになるので、まとめてやってしまうのがおすすめです。
ここまでで解決……とはいかず、この先に罠が2つありました。
罠1:ACFの無料版は「どこから落とすか」を確認する
再インストール用のzipを用意する段階で、Advanced Custom Fields(ACF)で手が止まりました。
ACFには、配布場所をめぐる騒動の経緯があります。2024年10月にWordPress.org側がACFをフォークし、公式ディレクトリの「advanced-custom-fields」がSecure Custom Fieldsという別のプラグインに置き換えられました。その後、2024年12月の裁判所の仮処分命令を受けて配布ページは開発元のWP Engineに返還され、現在は本家のACFが配信されています。Secure Custom Fieldsは、別のプラグインとして独立した配布に変わりました。
つまり現在はWordPress.orgの公式ディレクトリからでも本家ACFを入手できますが、名前も機能もよく似たフォークが並存している以上、ダウンロード前に開発元(作者がWP Engineであること)を確認しておくのが安全です。
確実なのは、開発元の公式サイト(advancedcustomfields.com)から直接ダウンロードすることです。有償版(ACF PRO)を使っているサイトであれば、そもそも公式サイトからライセンス経由での取得になるので影響はありません。
再インストール前に、そのサイトが無料版と有償版のどちらを使っているかを必ず確認してください。
罠2:「辿ったリンクは期限が切れています」の正体
zipを用意して管理画面からアップロードしたところ、今度はこのエラーが出ました。
辿ったリンクは期限が切れています。
このメッセージは原因を一切示してくれません。セッション切れやnonceの期限切れを疑いたくなりますが、実際の原因は違いました。サーバーのアップロードサイズ上限を超えていただけです。
このサーバーの上限は2MBで、ACFのzipはそれを超えていました。上限を超えたPOSTはPHPの段階で中身が破棄されるため、WordPressから見るとPOSTデータが空になります。結果としてnonceも受け取れず、「不正なリクエスト」と判断されてこのエラーになる、という流れです。
現在の上限は、管理画面の「メディア」→「新規追加」画面や、サイトヘルス情報のサーバー項目から確認できます。
最終手段:FTPで解凍済みフォルダを直接設置する
php.ini や .htaccess で上限を引き上げる方法もありますが、サーバーの権限的に触れないケースもあります。今回は管理画面を諦めて、FTPで直接設置しました。
- zipをローカルで解凍する
- FTPで
wp-content/plugins/配下にフォルダごとアップロードする - 管理画面のプラグイン一覧に表示されることを確認する
- 有効化する
アップロード上限はあくまで「管理画面からのPOST」に対する制限なので、FTPには関係ありません。管理画面で詰まったらFTP、というのは覚えておくと便利です。
設置後、FTPでフォルダの所有者を確認し、現在のPHP実行ユーザーになっていることをチェックしました。これで根本原因が解消されたことになります。
まとめ:引き継ぎ案件で最初に見るべきこと
今回の一件で得た教訓は3つあります。
プラグインの更新が「複数まとめて」失敗したら、権限を疑う
1つだけ失敗するならプラグイン固有の問題ですが、複数が同時に失敗する場合はファイルシステム側の問題である可能性が高いです。管理画面で粘らず、FTPで所有者を確認するのが最短ルートになります。
移行済みサイトを引き継いだら、ファイル所有者を確認する
サーバー移行が絡んだサイトは、この手の残骸を抱えていることがあります。しかもサイトは正常に動いてしまうため、日常の運用では発覚しません。XML-RPCの無効化のようなセキュリティ設定の確認とあわせて、引き継ぎ時のチェック項目に入れておくと、更新作業当日に慌てずに済みます。
エラーメッセージを額面どおりに受け取らない
「辿ったリンクは期限が切れています」がアップロード上限の話だったように、WordPressのエラーメッセージは原因を正確に示さないことがあります。メッセージで検索して出てこなければ、実際に何が起きているかを1段下のレイヤーで確認したほうが早いです。
よくある質問
プラグインの更新が失敗したら、まず何を確認すればいいですか?
失敗しているのが1つだけか複数かを確認してください。複数まとめて失敗している場合は、プラグイン側ではなくファイルの権限や所有者を疑うのが近道です。FTPやサーバーのファイルマネージャーで、正常に更新できるプラグインのフォルダと、失敗するフォルダの所有者を見比べると判断できます。
プラグインのフォルダをリネームすると、設定は消えますか?
プラグインの設定値の多くはデータベース側に保存されているため、フォルダを入れ替えても基本的には引き継がれます。ただしプラグインによって挙動は異なりますし、リネームした時点でそのプラグインは停止します。作業前にバックアップを取り、アクセスの少ない時間帯に実施してください。
「辿ったリンクは期限が切れています」と表示されたときの対処法は?
アップロードしようとしたファイルのサイズが、サーバーの上限を超えていないか確認してください。上限を超えたPOSTはPHPの段階で破棄され、結果的にこのエラーになります。上限を引き上げられない場合は、FTPで解凍済みのフォルダを直接設置する方法で回避できます。
ACFの無料版はどこから入手すればいいですか?
開発元の公式サイト(advancedcustomfields.com)からのダウンロードが確実です。WordPress.orgの公式ディレクトリは、2024年10月に一時Secure Custom Fieldsというフォークに置き換えられた経緯がありますが、現在は本家ACFの配布に戻っています。名前も機能も似たフォークが並存しているため、入手時は開発元がWP Engineであることを確認してください。
ENVY DESIGNでは、他社が制作したサイトの引き継ぎや、こうしたサーバー起因のトラブル対応を含めたWebサイトの保守運用を行っています。更新が止まってしまった、引き継いだサイトの状態が分からないといった場合は、お問い合わせからお気軽にご相談ください。