2026年7月26日

2026年7月26日

WordPressでアップロードディレクトリが書き込み不可になる原因と直し方

メディアのアップロード時に「アップロードしたファイルを移動できませんでした」「ディレクトリを作成できませんでした。親ディレクトリのアクセス権はサーバーによる書き込みを許可していますか?」といったメッセージが出る場合、原因の大半は wp-content/uploads の所有者・パーミッション・保存先の設定のどれかです。この記事では、どれが原因かを順番に切り分け、パーミッションを必要以上に緩めずに書き込みできる状態へ戻す手順を解説します。

エラーの意味:PHPが uploads に書き込めていない

WordPress がファイルを受け取ると、PHP はいったんサーバーの一時ディレクトリに保存し、そこから wp-content/uploads/年/月/ へ移動します。上のメッセージは、この「年月フォルダーを作る」または「一時ファイルを移動する」処理が失敗したことを示しています。

ポイントは、書き込みを行うのがあなたのFTPユーザーではなく、Webサーバー上で動くPHPのプロセスだという点です。FTPソフトでは問題なくファイルを置けるのに WordPress からは書き込めない、という状況はこのずれから生まれます。

主な原因は次のとおりです。

  • uploads ディレクトリの所有者が、PHP の実行ユーザーと違う(移行・復元・root での作業後に起きやすい)
  • パーミッションが厳しすぎる(ディレクトリが 555 や 500 など)
  • 保存先が誤った場所を指している(upload_path オプションや UPLOADS 定数に、移行前サーバーのパスが残っている)
  • ディスク容量・inode の上限に達している
  • open_basedir 制限や SELinux により、PHP がそのパスへの書き込みを許されていない

作業前の準備:バックアップを取る

所有者やパーミッションの変更は、範囲を誤るとサイト全体が表示できなくなることがあります。作業前に、少なくとも wp-content ディレクトリ一式とデータベースのバックアップを取ってください。レンタルサーバーの管理パネルにバックアップ機能があればそれを使い、無い場合は FTP でのダウンロードと、データベースのエクスポートを行っておきます。

手順1:サイトヘルスで書き込み状態を確認する

まず管理画面の「ツール」→「サイトヘルス」を開き、「情報」タブの「ファイルシステムの権限」を展開します。ここに WordPress ディレクトリ、wp-content、アップロードディレクトリ、プラグイン、テーマなどが「書き込み可能」か「書き込み不可」かが一覧で表示されます。

アップロードディレクトリだけが書き込み不可なら uploads 配下の問題、wp-content 全体が書き込み不可なら所有者がまとめてずれている可能性が高い、というように範囲を絞れます。同じ画面の「メディアの処理」には最大アップロードサイズなども出るので、ファイルサイズが原因の別エラーと区別するのにも役立ちます。

手順2:保存先のパスが正しいか確認する

所有者やパーミッションをいじる前に、WordPress がそもそもどこに書き込もうとしているかを確認します。サーバー移行後に多いのが、データベースの upload_path オプションに旧サーバーのフルパス(例: /home/olduser/public_html/wp-content/uploads)が残っているケースです。この場合、新サーバーにはそのディレクトリが存在しないため、いくらパーミッションを直しても書き込めません。

WP-CLI が使える環境では、次のコマンドで実際の保存先とエラー内容を確認できます。

# 保存先の設定値(通常は空)
wp option get upload_path
wp option get upload_url_path

# WordPress が実際に使う保存先と、エラーの有無
wp eval 'print_r( wp_upload_dir() );'

wp_upload_dir() の結果の path が想定どおりの場所か、error に値が入っていないかを見ます。upload_path に古いパスが入っていた場合は、値を空にすると既定の wp-content/uploads に戻ります。

wp option update upload_path ''

WP-CLI が使えない場合は、「設定」→「メディア」を開いてみてください。通常は表示されない「アップロードするファイルの保存場所」の入力欄が表示されていれば、upload_path に何らかの値が設定されているサインです。また、wp-config.php に define( 'UPLOADS', ... ); の行があれば、その値も確認します。

手順3:PHP の実行ユーザーと所有者を照らし合わせる

保存先が正しいのに書き込めない場合は、所有者を確認します。SSH で次のように実行します。

# uploads の所有者とパーミッション
ls -ld wp-content wp-content/uploads

# PHP-FPM や Web サーバーがどのユーザーで動いているか
ps aux | grep -E 'php-fpm|apache2|httpd|nginx' | grep -v grep

たとえば PHP-FPM のワーカーが www-data で動いているのに、uploads の所有者が root になっていれば、PHP は書き込めません。VPS などで所有者を直せる環境なら、uploads 配下を PHP の実行ユーザーに揃えます。

# 例: PHP の実行ユーザーが www-data の場合(環境に合わせて変更)
sudo chown -R www-data:www-data wp-content/uploads

共用レンタルサーバーでは、FTP ユーザーと PHP の実行ユーザーが同じになるよう設計されていることが多く、所有者を自分で変える操作は通常できません。その場合は次のパーミッション調整、またはサーバー会社への問い合わせに進みます。

手順4:パーミッションを標準値に戻す

WordPress の一般的な推奨は、ディレクトリ 755、ファイル 644 です。uploads 配下がこれより厳しくなっていれば、次のように戻します。

find wp-content/uploads -type d -exec chmod 755 {} \;
find wp-content/uploads -type f -exec chmod 644 {} \;

FTP ソフトでも、uploads フォルダーを右クリックして「属性の変更」などからディレクトリのみ 755 を再帰的に適用できます。

ここでつまずきやすいのが「とりあえず 777 にすれば動く」という対処です。777 は所有者以外の誰でも書き込める状態で、共用サーバーでは他ユーザーや侵入したスクリプトにファイルを置かれる危険があります。777 でしか動かないなら、それは所有者がずれているという合図なので、手順3に戻って根本原因を直してください。

手順5:容量・PHP の制限を確認する

所有者もパーミッションも正しいのに失敗する場合は、サーバー側の制限を疑います。

  • ディスク容量: df -h と df -i で、容量と inode に空きがあるか確認します。共用サーバーでは管理パネルの使用量表示を見ます。容量が満杯でも「書き込めない」系のメッセージになります。
  • 一時ディレクトリ: アップロードはまず PHP の upload_tmp_dir(未設定ならシステムの一時ディレクトリ)に保存されます。ここが満杯・書き込み不可だと移動の段階で失敗します。
  • open_basedir: PHP の設定で許可されたパスの外に保存先があると書き込めません。wp-content/debug.log やサーバーのエラーログに「open_basedir restriction in effect」と出ていればこれが原因です。
  • SELinux: RHEL 系の VPS では、パーミッションが正しくても SELinux のコンテキストが原因で拒否されることがあります。ls -Z で確認し、書き込み用のコンテキスト(httpd_sys_rw_content_t など)を設定します。

エラーログを見るには、wp-config.php の「編集が必要なのはここまでです」の行より上に次を追加し、アップロードを再度試してから wp-content/debug.log を確認します。

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

原因が分かったら、本番環境では WP_DEBUG を false に戻します。

直ったかどうかの確認方法

修正後は、サイトヘルスの「ファイルシステムの権限」でアップロードディレクトリが「書き込み可能」になっているかを見たうえで、小さな画像を1枚アップロードします。メディアライブラリにサムネイル付きで表示され、wp-content/uploads に今月の年月フォルダーが作られていれば正常です。

あわせて、アップロードされたファイルの所有者とパーミッションを ls -l で確認しておくと安心です。新しいファイルが 644 前後で作られていれば、今後も同じ問題は起きにくくなります。

なお、アップロード時のメッセージ表記や管理画面の項目名は WordPress のバージョンや翻訳によって多少異なることがあります(2026年10月現在)。

まとめ

  • アップロードディレクトリの書き込みエラーは、PHP の実行ユーザーが uploads に書き込めないことが原因
  • まずサイトヘルスの「ファイルシステムの権限」で範囲を確認し、次に upload_path や UPLOADS で保存先が正しいかを見る
  • 所有者を PHP の実行ユーザーに揃え、パーミッションはディレクトリ 755・ファイル 644 を基本にする
  • 777 で動くなら所有者のずれのサイン。根本原因を直して標準値に戻す
  • 容量・一時ディレクトリ・open_basedir・SELinux もエラーログで確認する

お気軽にご相談ください

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